这是我遇到问题的代码:
结构:
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/