首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Malloc故障

Malloc故障
EN

Stack Overflow用户
提问于 2012-08-27 12:07:15
回答 2查看 114关注 0票数 0

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

代码语言:javascript
复制
#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);
    }
}

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

有谁知道为什么会发生这种情况吗?非常感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-27 12:10:11

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

代码语言:javascript
复制
char** send_buffer = malloc (SLIDINGWINDOW * sizeof(send_buffer[0]));

代码语言:javascript
复制
send_buffer[i] = malloc (SEGMENTSIZE * sizeof(send_buffer[i][0]));

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

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

注意,我已经从malloc调用中删除了强制转换,在C中,强制转换不是必需的,并且can sometimes mask an error.

进一步的改进是使用strncpy()来确保您不会在段的末尾写入字符:

代码语言:javascript
复制
strncpy(send_buffer[i], "Hello, world", SEGMENTSIZE);

请注意,在源字符串大于SEGMENTSIZE的情况下,目标字符串不会以null结尾。您可以使用以下命令来修复此问题:

代码语言:javascript
复制
send_buffer[i][SEGMENTSIZE - 1] = '\0';

strncpy()之后。

票数 6
EN

Stack Overflow用户

发布于 2012-08-27 12:10:53

这将仅为SLIDINGWINDOW字节生成足够的空间

代码语言:javascript
复制
malloc (SLIDINGWINDOW)

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

代码语言:javascript
复制
malloc (SLIDINGWINDOW * sizeof(char*))

幸运的是,您的第二个malloc()是正确的;sizeof(char)始终为1

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12136114

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档