【发布时间】:2017-04-19 01:10:48
【问题描述】:
这是我遇到问题的代码:
结构:
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 时,就会出现问题。
我收到分段错误。
我如何尝试这样做似乎并不重要,我已经阅读了各种示例并尝试了各种方法,但我无法让它发挥作用。我知道这里有一些内存问题,但我似乎无法解决它。
即使我尝试使用realloc 结构,我也无法将strB 初始化为NULL 以外的任何内容。我需要能够在运行时附加到atob->strB,字符串的最终长度与atob->strA 的长度不同。
按照网上的例子,我认为这(作为最简单的初始化)会起作用......但它不起作用:
atob->strB = NULL;
atob->strB = (char*)malloc(1);
atob->strB[0] "\0";
它与它所在的结构有关吗?
我真的不知道出了什么问题,浪费了很多时间在各种论坛上搜索类似问题,阅读主题并尝试每一个解决方案,我只是试图解决第一个问题。
现在我很困惑,没有时间解决这个问题。如果有人可以告诉我我需要的实际代码,那么我将能够阅读并理解你做了什么以及为什么这是正确的方法。我已经在我不清楚的领域发表了评论,并且非常感谢正确的解决方案。
【问题讨论】:
-
您不需要将调用类型转换为 malloc。大多数 C++ 程序员都这样做,而且没有必要。
-
您可以使用调试器并显示崩溃的回溯吗?
-
为什么不赞成这个?如果问题不清楚,请让操作人员解释更多。
-
我做了一个示例程序来模拟你的情况。检查[ this ] 一段代码。
-
@sjsam:我听到了,但这已经在 Meta 上讨论了很多,答案是永远不会通过技术手段强迫选民发表评论或原因 - 投票将永远是匿名的。但是,我同意选民自愿提供理由会很好!
标签: c struct char segmentation-fault malloc