gpt4 book ai didi

c - 为动态字符串列表分配内存

转载 作者:行者123 更新时间:2023-11-30 14:54:35 26 4
gpt4 key购买 nike

int strings(void){
int NumStrings = 3;
char **strings = (char**) malloc(sizeof(char*) * NumStrings);
int i;
char * element = "Trevor";
for(i = 0; i < NumStrings; i++){
strings[i] = ((char*) malloc(sizeof(char) * strlen(element)+1));
}
strings[0] = "abcdef";
strings[1] = "lemons";
strings[2] = "zoozoo13333";
for(i = 0; i < NumStrings; i++){
printf("%s\n", strings[i]);
}
}

为什么这不会导致段错误?我没有为“zoozoo13333”分配足够的内存,但它仍然可以正常打印,并且不会抛出任何错误。数组中难道不应该只有足够的空间容纳 6 个字符长的字符串吗?

最佳答案

您没有遇到缓冲区溢出,因为您根本没有写入缓冲区。

strings[2] = "zoozoo13333";

不会复制字符串,它只是将strings[2]更改为指向字符串文字的内存,而不是使用malloc()分配的缓冲区。结果,您出现了内存泄漏,因为您已经分配了内存,但没有任何东西再指向它。

要复制字符串,您必须使用strcpy()。如果这样做,您将会遇到缓冲区溢出:

strcpy(strings[2], "zoozoo13333");

这会导致未定义的行为,因为您写入的内容超出了缓冲区的末尾。它不一定会导致段错误。请参阅Why don't I get a segmentation fault when I write beyond the end of an array?

关于c - 为动态字符串列表分配内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46617167/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com