C语言 为什么只使用“="时没有分段错误?

c9x0cxw0  于 2023-06-28  发布在  其他
关注(0)|答案(1)|浏览(141)

我对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个字符串的数组?
抱歉,我的问题不清楚。任何帮助都是非常感谢的。

eh57zj3b

eh57zj3b1#

string是一个分配的数组,可以容纳7个char值。它最初是用随机垃圾值填充的,因为您没有初始化它。然后将"123456"复制到其中,从而在其中存储有效值。
store是一个分配的数组,可以容纳8个char*指针。它最初是用随机垃圾指针填充的,因为您没有初始化它。
store[0] = string;中,string衰减为指向其第一个charchar*指针,然后将该指针保存到store的第一个元素。由于store已分配,因此可以将char*分配给其第一个元素。
strcpy(store[0], string)中,您将string的 * 内容 * 复制到store中第一个char*当前指向的内存地址。如果该地址不能写入,则发生segfault。如果char*指针未初始化,或者如果string未初始化(或不是空终止),则行为为 undefined

相关问题