【发布时间】:2018-03-18 22:26:00
【问题描述】:
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 个字符长的字符串吗?
【问题讨论】:
-
分配字符串字面量不需要任何内存分配。你实际上在这里泄漏了内存。也不要强制转换
malloc和sizeof(char)的返回值总是1 -
因为你没有缓冲区溢出,而是内存泄漏:
strings[2] = "zoozoo13333";将丢弃分配内存的句柄并分配字符串字面量。
标签: c memory-management