0

这段代码导致分段错误:

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

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

谁能明白为什么会这样?非常感谢!

4

2 回答 2

6

传递给的大小malloc()不正确。你可能的意思是:

char** send_buffer = malloc (SLIDINGWINDOW * sizeof(send_buffer[0]));

send_buffer[i] = malloc (SEGMENTSIZE * sizeof(send_buffer[i][0]));

这是因为 to 的参数malloc()是您要求的字节数,因此您需要将所需的长度乘以元素的大小。

此外,您还应该检查从返回的值 malloc()is not NULL

请注意,我已经从 malloc 调用中删除了强制转换 - 在 C 中,强制转换不是必需的,并且有时可以掩盖错误。


进一步的改进是用于strncpy()确保您不会在段结束后写入字符:

strncpy(send_buffer[i], "Hello, world", SEGMENTSIZE);

请注意,如果源字符串大于SEGMENTSIZE,则目标字符串不会以空值结尾。您可以通过以下方式解决此问题:

send_buffer[i][SEGMENTSIZE - 1] = '\0';

之后strncpy()

于 2012-08-27T04:10:10.827 回答
2

这将只为SLIDINGWINDOW 字节产生足够的空间:

malloc (SLIDINGWINDOW)

您需要足够的空间来存放SLIDINGWINDOW 指针

malloc (SLIDINGWINDOW * sizeof(char*))

你的第二个malloc()是幸运的;sizeof(char)总是1

于 2012-08-27T04:10:53.137 回答