Malloc发生故障

时间:2012-08-27 04:07:15

标签: c

这段代码会导致分段错误:

#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);
    }
}

奇怪的是,如果你把第二个循环的内容放到第一个循环中,它就可以了!

有人能看出为什么会这样吗? 非常感谢!

2 个答案:

答案 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