【问题标题】:Malloc strange crashesmalloc 奇怪的崩溃
【发布时间】:2023-02-02 19:18:26
【问题描述】:

我试图在 C 中实现链表,然后我决定实现相同的逻辑来创建一个“字符串”,本质上是具有更多功能的相同链表,主要是从输入字符串创建链表对象。当给定一个像 35 个字符的小输入字符串时,该代码工作得很好,但当输入字符串较大时,第一次运行 malloc 时会崩溃。现在我尝试在另一台机器上运行这段代码,它可以完美地处理任何大小的字符串(低于 1000 个字符),所以我怀疑我的机器有问题,原因是这些函数:

struct Map
{
char val;
struct Map *next;
};


void makeString(struct Map **head, char *needStr){
int i = 0;
while (needStr[i] != '\0'){
    insert(head, needStr[i]);
    i++;
}
}

void insert(struct Map **head, char value){
printf("%c", value);
if ((*head) == NULL)
{
    (*head) = (struct Map *)malloc(sizeof(struct Map));
    (*head)->val = value;
    (*head)->next = NULL;
}
else
{
    struct Map *cur = *head;
    while (cur->next != NULL)
    {
        cur = cur->next;
    }

    struct Map *New = (struct Map *)malloc(sizeof(struct Map));
    New->val = value;
    New->next = NULL;
    cur->next = New;
}

}

int main()
{
struct Map *list = NULL;
char *a = (char*) malloc(sizeof(char)); 
scanf("%[^\n]",a); 
makeString(&string, a);
}

为了更直观地理解问题,这里有一个例子:

输入:

你好吗?

输出:

你好吗?

代码有效,运行在 main 中调用的所有其他函数。

输入: “****************************************************** ****************************************************** ****************************************************** *"

输出: “*”

vscode 指出插入函数内的 malloc 错误,它发生在第一次迭代中。

【问题讨论】:

  • 您的真实代码是否没有对您调用的函数的前向声明?请尝试创建一个合适的minimal reproducible example 给我们看。

标签: c memory malloc heap-memory


【解决方案1】:

问题在这里:

malloc(sizeof(char));

你分配空间一单特点。如果你读取一个字符串,那只能适合字符串终止符。

您需要确保有足够的空间来容纳所有输入以及字符串终止符。

我建议您创建一个固定大小的实际数组,然后使用 fgets 来读取您的输入行。这使得限制输入变得更容易:

char a[256];
fgets(a, sizeof a, stdin);

如果您担心 fgets 留在缓冲区中的换行符,请参阅 this old answer

并记得检查fgets 是否成功。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-16
    • 2019-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-01
    • 2016-10-27
    相关资源
    最近更新 更多