c - 在结构中重新分配内存后出现奇怪的文本
问题描述
将字符串从指针打印到指针数组后会出现奇怪的字符。有时甚至像内存耗尽一样崩溃。这是为什么?每件事都需要动态。有时,如果我只写一两个原因,这些错误就不会发生。输出 - a═══asda 或 adsas═²²²²²²════⌡X╩▒2。
#define MAX_LENGTH 50
#define ONE 1
#define TWO 2
#define THREE 3
#define EXIT 4
typedef struct list
{
char** reasons;
}list;
int main(void)
{
list pros = { (char*)malloc(sizeof(char) * MAX_LENGTH) };
list cons = { (char*)malloc(sizeof(char) * MAX_LENGTH) };
char* reason = 0;
char* dillema = 0;
reason = (char*)malloc(sizeof(char) * MAX_LENGTH);
dillema = (char*)malloc(sizeof(char) * MAX_LENGTH);
printf("What is your dillema? \n");
fgets(dillema, MAX_LENGTH, stdin);
dillema[strcspn(dillema, "\n")] = 0;
dillema = (char*)realloc(dillema, sizeof(char) * strlen(dillema) + ONE);
switch (selection)
{
case ONE:
printf("Enter a reason to add to list PRO: \n");
fgets(reason, MAX_LENGTH, stdin);
reason[strcspn(reason, "\n")] = 0;
reason = (char*)realloc(reason, (sizeof(char) * strlen(reason)) + 1);
pros.reasons = (char**)realloc(pros.reasons, (sizeof(char*) * prosCounter) + 1);
strcpy(pros.reasons + prosCounter, reason);
prosCounter += ONE;
break;
case TWO:
printf("Enter a reason to add to list CON: \n");
fgets(reason, MAX_LENGTH, stdin);
reason[strcspn(reason, "\n")] = 0;
reason = (char*)realloc(reason, (sizeof(char) * strlen(reason)) + 1);
cons.reasons = (char**)realloc(cons.reasons, (sizeof(char*) * consCounter) + 1);
strcpy(cons.reasons + consCounter, reason);
consCounter += ONE;
break;
case THREE:
printf("Your dillema: \n%s \n\n", dillema);
printf("LIST PROS\n_________ \n");
for (i = 0; i < prosCounter; i++)
{
printf("%s \n", pros.reasons + i);
}
printf("LIST CONS\n_________ \n");
for (i = 0; i < consCounter; i++)
{
printf("%s \n", cons.reasons + i);
}
printf("\n\n");
break;
case EXIT:
break;
}
}
}
解决方案
这些是导致问题的行(仅第二行,但我还显示了第一行以显示上下文):
pros.reasons = (char**)realloc(pros.reasons, (sizeof(char*) * prosCounter) + 1);
strcpy(pros.reasons + prosCounter, reason);
基本上,您将整个字符串复制到未初始化的指针中。
如果您只想指向字符串,请为其分配一个指针。如果你想要一个副本,你应该使用strndup()
推荐阅读
- python - 运行代码时跟踪目录或文件更改
- centos - 如何在 CentOS 7 中将 libxml2 升级到 2.9.9 版本?
- css - Angular flex 布局 - 太多重复
- c# - 在序列化之前将 string[] 转换为字符串
- ruby-on-rails - 如何在 Rails 中获取必要的数据
- google-chrome - 如何防止客户端服务器中的 getUsermedia 浏览器?
- python - 如何设置窗口和它的graphicScene透明(使用滑块)并只留下QPushButton可见
- netsuite - Netsuite 报告列表字段
- cs-cart - CS Cart 重复控制器索引页错误
- powershell - 按索引引用 ENUM