c++一维数组为什么能表示多维数组


int main(int argc, const char * argv[])
{
    char cstr[1];
    std::string str("name");
    memcpy(cstr, str.c_str(), str.length());
    cstr[str.length()] = 0;
    cout << cstr << endl;
    
    return 0;
}

这段代码cstr只是一个含有一个char型的数组,为什么memcpy可以正确执行;能否再给出一些例子,比如char cstr[8], 表示8个字符串,类似的一个一维数组,每一维都是一个数组

str.c_str()的返回值也是一个指针。
memcpy不做大小检查,你把5个元素复制到1个元素的数组,已经越界了,不安全。

看图,你去cout一个数组,遇到'\0'就停止输出。你刚初始化cstr的时候,第一个元素是0,下一个位置就被自动填上一个'\0'。你memcpy之后,之前的'\0'就被字符a覆盖了,而图片下面那个'\0'是str的。这个时候你去输出cstr,遇到'\0'才会结束,自然就会输出name。但cstr这个数组的大小还是1,你可以用打印sizeof(cstr)的值看看,大小肯定还是1。
一个数组的元素地址是连续的,只是用'\0'去代表数组结束的地方,并不是说'\0'后面就没有东西了。

img

memcpy的签名如下

void * memcpy(void *__dst, const void *__src, size_t __n)


这个函数根本不管原地址和目的地址是什么,只是单纯的把n个字节的内容从原地址copy到目的地址
你的代码越界了,执行可能崩溃。

另外一维数组当二维多维用也很容易理解啊。举一个1维当2维的例子。 比如一个15个元素的1维数组 a,你也可以把它当成包含3个数组,每个含有5个元素的二维数组 b。地址换算关系为 b[i][j] 相当于访问 a[i*5+j]

越界导致的问题是不可控的,比如你大小是1,但是处理占了后面的内存,如果后面空间别人处理,,,,

img

一维数组是一维数组,这里与字符串相关的知识点就是用字符数组保存字符串,用指针处理c字符串,你可以了解一下,至于其他就是在这个基础上了