Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Malloc故障_C - Fatal编程技术网

Malloc故障

Malloc故障,c,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<SLIDINGWI

这段代码导致分段错误:

#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);
    }
}
奇怪的是,如果你把第二个循环的内容放到第一个循环中,它就工作了

有人知道为什么会这样吗? 非常感谢

传递给malloc的大小不正确。你可能是说:

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

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

此外,还应检查malloc返回的值是否为NULL

注意,我已经从C中的malloc调用中删除了强制转换,强制转换不是必需的,并且

进一步的改进是使用以下方法确保您不会在段结束后写入字符:

strncpy(send_buffer[i], "Hello, world", SEGMENTSIZE);
请注意,如果源字符串大于SEGMENTSIZE,则目标字符串不会以null结尾。您可以通过以下方法解决此问题:

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

在strncpy之后。

这将只为滑动窗口字节生成足够的空间:

您需要足够的空间来放置滑动窗口指针:


你的第二个malloc是幸运的;sizeofchar始终为1。

更可靠的写入方法是char**send_buffer=malloc SLIDINGWINDOW*sizeof*send_buffer;;更一般地说:某些类型*foo=mallocCOUNT*sizeof*foo;
send_buffer[i][SEGMENTSIZE - 1] = '\0';
malloc (SLIDINGWINDOW)
malloc (SLIDINGWINDOW * sizeof(char*))