这段代码会导致分段错误:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SLIDINGWINDOW 5
#define SEGMENTSIZE 100
int main() {
char** send_buffer = (char**) malloc (SLIDINGWINDOW);
int i;
for (i = 0; i<SLIDINGWINDOW; ++i) {
send_buffer[i] = (char*) malloc (SEGMENTSIZE);
}
for (i = 0; i<SLIDINGWINDOW; ++i) {
strcpy(send_buffer[i], "Hello, world");
printf("%s\n", send_buffer[i]);
fflush(NULL);
}
}
奇怪的是,如果你把第二个循环的内容放到第一个循环中,它就可以了!
有人能看出为什么会这样吗? 非常感谢!
答案 0 :(得分:6)
传递给malloc()
的大小不正确。你可能意味着:
char** send_buffer = malloc (SLIDINGWINDOW * sizeof(send_buffer[0]));
和
send_buffer[i] = malloc (SEGMENTSIZE * sizeof(send_buffer[i][0]));
这是因为malloc()
的参数是你要求的字节数,所以你需要将你想要的长度乘以元素的大小。
此外,您还应检查malloc()
返回的值是否为NULL
。
请注意,我已从malloc调用中删除了强制转换 - 在C中,不需要强制转换,can sometimes mask an error.
进一步改进是使用strncpy()
确保您不会在片段结束后写字符:
strncpy(send_buffer[i], "Hello, world", SEGMENTSIZE);
请注意,如果源字符串大于SEGMENTSIZE
,则目标字符串不会以空值终止。您可以使用以下方法解决此问题:
send_buffer[i][SEGMENTSIZE - 1] = '\0';
在strncpy()
之后。
答案 1 :(得分:2)
这将为SLIDINGWINDOW
字节:
malloc (SLIDINGWINDOW)
您需要足够的空间来容纳SLIDINGWINDOW
指针:
malloc (SLIDINGWINDOW * sizeof(char*))
你的第二个malloc()
运气正确; sizeof(char)
始终为1
。