下面这段代码会导致分段错误:
#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);
}
}奇怪的是,如果你把第二个循环的内容放到第一个循环中,它就能工作!
有谁知道为什么会发生这种情况吗?非常感谢!
发布于 2012-08-27 12:10:11
传递给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的情况下,目标字符串不会以null结尾。您可以使用以下命令来修复此问题:
send_buffer[i][SEGMENTSIZE - 1] = '\0';在strncpy()之后。
发布于 2012-08-27 12:10:53
这将仅为SLIDINGWINDOW字节生成足够的空间
malloc (SLIDINGWINDOW)您需要足够的空间来存放SLIDINGWINDOW指针
malloc (SLIDINGWINDOW * sizeof(char*))幸运的是,您的第二个malloc()是正确的;sizeof(char)始终为1。
https://stackoverflow.com/questions/12136114
复制相似问题