c - malloc 上的 struct * 和 char * 段错误

标签 c struct char segmentation-fault malloc

这是我遇到问题的代码:

结构:

struct AtoB
{
    char * strA;
    char * strB;
};

创建结构的函数。从外部文件调用。

AtoB * atob_create(char * a)
{
    struct AtoB * atob = (struct AtoB *)malloc(sizeof(struct AtoB));
    atob->strA = malloc(sizeof((char *)a));
    strcpy(atob->strA, a);

    atob->strB = NULL;
    /* HERE IS PROBLEM NO 1 - SEGMENTATION ERROR OCCURS */
    atob->strB = (char*)malloc(1);
    strB = "\0";

    for(int i = 0; i < (int)strlen(atob->strA); i++)
    {
        char token = atob->strA[i];
        /*
        : 
            append(AtoB * atob, const char a) MAY be called, so atob->strB &
            atob->StrA will not be the same length 
        */
        append(atob, (char)token);
    }
}

char 附加到 struct 中的 char * 的函数。递归调用。

void append(AtoB * atob, const char a)
{
    size_t sz = strlen(atob->strB);
    /* HERE IS ANOTHER ISSUE:
       1: is this the right way to increase the size of the char * ?
       2: does the struct also need to be realloc here to accommodate? 
    */
    atob->strB = (char*)realloc(atob->strB, sz + 1);
    atob->strB[sz - 1 = a];
    atob->[sz] = "\0";
}

检索最终字符串的函数。从外部文件调用。

char * (AtoB * atob)
{
    return (atob->strB);
}

函数释放所有分配的内存。从外部文件调用。

void free(AtoB * atob)
{
    free(atob->strA);
    free(atob->strB);
    free(atob);
}

作为一项练习,我需要使用 C 并获取一个字符串的内容,以不同的顺序复制它,或者根据这里没有问题的标准省略或添加某些字符(因此不包括在代码中)。

我在创建结构或分配第一个 char * strA 时没有遇到问题。当我尝试将内存(甚至一个字符)分配给 char * strB 时,问题就出现了。

我收到一个段错误。

我如何尝试这样做似乎并不重要,我已经阅读了各种示例并尝试了各种方法,但我就是无法让它工作。我知道这里有一些内存问题,但我似乎无法解决它。

即使我尝试重新分配 结构,我也无法将strB 初始化为NULL。我需要能够在运行时追加到 atob->strB,字符串的最终长度与 atob->strA 的长度不同。

按照在线示例,我认为这(作为最简单的初始化)会起作用……但它没有:

atob->strB = NULL;
atob->strB = (char*)malloc(1);
atob->strB[0]  "\0";

是否与它所在的结构有关?

我真的不知道哪里出了问题,我浪费了很多时间在各种论坛上搜索类似的问题,阅读主题并尝试每一个解决方案,我只是想通过这第一个问题。

现在我很困惑,没时间解决这个问题。如果有人能告诉我我需要的实际代码,那么我将能够阅读它并理解你做了什么以及为什么这是正确的方法。我在我不清楚的地方发表了评论,非常感谢正确的解决方案。

最佳答案

这段代码并没有像你想的那样:

atob->strA = malloc(sizeof((char *)a));
                    ^ sizeof(char *) is fixed. probably 4 or 8.

因此,如果a 指向一个更长的字符串,就会发生缓冲区溢出。

如果您使用的是 Linux,您最好运行 valgrind 内存检查程序以确保您没有额外的内存处理问题。

调试信息:

编译确保它是用调试符号编译的(在 gcc 命令中添加 -g)

$ gcc -g -Wall -Werror a.c -o a.out

用gdb运行

$ gdb ./a.out

崩溃后,寻找回溯

(gdb) bt

当你拥有它时,只需看看崩溃的位置并尝试理解原因。

因为我们正在处理内存处理问题,所以使用 valgrind:

$ valgrind --leak-check=full ./a.out

查看输出并清除错误。

关于c - malloc 上的 struct * 和 char * 段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40960753/

相关文章:

c - 分析和提高嵌入式系统性能的步骤/策略是什么?

unit-testing - 如何在 Rust 中测试结构的实例化?

java - 从 int 到 char 可能有损;从文本文件读入时发生

c - getche 函数中的运行时错误

c - 让 fgets 将字符保存到 C 中的变量中

c - 程序在 Linux 用户空间的 FD_SET 宏处挂起

c++ - NPAPI 调用参数包装

go - 如果 struct golang 中的值为 nil、0、false,则更新字段?

ios - 如何让我的形象隐藏在我的标签后面?

c++ - 根据用户输入创建一个字符数组