这段代码导致分段错误:
#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);
}
}
Run Code Online (Sandbox Code Playgroud)
奇怪的是,如果你把第二个循环的内容放到第一个循环中,它就可以了!
谁能明白为什么会这样?非常感谢!
传递给的大小malloc()不正确.你可能意味着:
char** send_buffer = malloc (SLIDINGWINDOW * sizeof(send_buffer[0]));
Run Code Online (Sandbox Code Playgroud)
和
send_buffer[i] = malloc (SEGMENTSIZE * sizeof(send_buffer[i][0]));
Run Code Online (Sandbox Code Playgroud)
这是因为参数to malloc()是你要求的字节数,所以你需要将你想要的长度乘以元素的大小.
此外,还应检查返回的值 malloc()是否为NULL.
请注意,我已经从malloc调用中删除了强制转换 - 在C中,不需要强制转换,并且有时可以屏蔽错误.
进一步的改进是用来strncpy()确保你不会在片段结束后写字符:
strncpy(send_buffer[i], "Hello, world", SEGMENTSIZE);
Run Code Online (Sandbox Code Playgroud)
请注意,在源字符串大于的情况下,SEGMENTSIZE目标字符串将不会以空值终止.您可以使用以下方法解决此问题
send_buffer[i][SEGMENTSIZE - 1] = '\0';
Run Code Online (Sandbox Code Playgroud)
之后strncpy().