我对C中不同场景下的内存分配方式感到困惑。
例如,假设我创建了:char string[7];
char *store[8];
然后,我让“string”是“123456\0”。
当我有store[0] = string;
时,store[0]成功地存储了“string”的第一个字符的地址,当使用%s打印时,正确地打印“123456”。
但是,当我执行strcpy(store[0], string)
时,我得到了一个分段错误,因为我没有访问允许我访问的内存。
但是,当使用第一个方法(store[0] = string
)时,我不是已经分配和保留了内存来创建store[0]吗?这里的内存处理有什么不同?
store[0]是否在这两种情况下都不存在,因为我一开始就通过char *store[8]
创建了store[8],这应该会产生一个充满(垃圾)数据的8个字符串的数组?
抱歉,我的问题不清楚。任何帮助都是非常感谢的。
1条答案
按热度按时间eh57zj3b1#
string
是一个分配的数组,可以容纳7个char
值。它最初是用随机垃圾值填充的,因为您没有初始化它。然后将"123456"
复制到其中,从而在其中存储有效值。store
是一个分配的数组,可以容纳8个char*
指针。它最初是用随机垃圾指针填充的,因为您没有初始化它。在
store[0] = string;
中,string
衰减为指向其第一个char
的char*
指针,然后将该指针保存到store
的第一个元素。由于store
已分配,因此可以将char*
分配给其第一个元素。在
strcpy(store[0], string)
中,您将string
的 * 内容 * 复制到store
中第一个char*
当前指向的内存地址。如果该地址不能写入,则发生segfault。如果char*
指针未初始化,或者如果string
未初始化(或不是空终止),则行为为 undefined。