Malloc发生故障

Yuk*_*awa 0 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

Tim*_*nes 6

传递给的大小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().