函数内部结构失效的 Malloc
Posted
技术标签:
【中文标题】函数内部结构失效的 Malloc【英文标题】:Malloc of a structure failure inside a function 【发布时间】:2021-09-05 01:20:43 【问题描述】:我有一个结构:
typedef struct cellNode
int cell;
struct cellNode* next;
Node;
typedef struct
int numRows;
int numColumns;
Node** rows;
Matrix;
还有一个在我的代码中添加节点的函数,但是当我尝试为函数内的节点分配内存时出现 0xC0000005 错误:
Node* createNode()
int n;
Node* newNode = malloc(sizeof(Node));
if (newNode==NULL)
exit(1);
scanf("%d",&n);
printf("n is %d\n",n);
newNode->cell=n;
newNode->next = NULL;
return newNode;
该函数为节点分配内存并将其返回给另一个函数,该函数将其附加到节点数组中。所以对 createNode 函数的调用如下所示:
Matrix* MatrixAdder(int row, int col, char mat)
int i,j;
int value=0;
Node* newNode=NULL;
Matrix* temp = malloc(sizeof(Matrix));
if (temp==NULL)
exit (1);
temp->numRows=row;
temp->numColumns=col;
temp->rows = malloc(row * sizeof(Node*));
if (temp->rows==NULL)
exit(1);
for (i=0;i<row;i++)
printf("Enter row %d data\n",i);
scanf("%d",&value);
temp->rows[i]->cell=value;
for (j=0;j<col-1;j++)
newNode=createNode();
temp->rows[i]->next=newNode;
我明白了:
Enter row 0 data
2
Process returned -1073741819 (0xC0000005) execution time : 6.525 s
Press any key to continue.
该函数能够接收 int,但在 malloc 行立即失败。 main 只是调用函数:
int main()
int i;
Matrix *A, *B, *C;
int n,m,k;
MatSize(&n,&m,&k); /*works fine*/
A=MatrixAdder(n, m, 'A');
B=MatrixAdder(m, k, 'B');
return 1;
【问题讨论】:
你能把它放在minimal reproducible example 中,这样我们就可以看到整个画面了吗? Cannot reproduce。请提供正确的minimal reproducible example,否则我们将无法提供帮助。 向我们展示“其他地方”,我们会指出如何。 但是错误来自这个函数,所以其他地方的问题是什么你以某种方式破坏了内存。当您的malloc()
呼叫踏上您在破坏内存时埋下的地雷时,您的进程就会爆炸。
CreateNode != newNode.
【参考方案1】:
在这里工作:
#include <stdlib.h>
#include <stdio.h>
typedef struct cellNode
int cell;
struct cellNode *next;
Node;
// and a function to add nodes in my code, but I get the 0xC0000005 error when i try to allocate memory for the node inside the function:
Node *createNode()
int n;
Node *newNode = malloc(sizeof(Node));
if (newNode==NULL)
exit(1);
scanf("%d",&n);
printf("n is %d\n",n);
newNode->cell=n;
newNode->next = NULL;
return newNode;
// The function allocates memory for a node and returns it to another function that appends it to an array of nodes. so the call for the createNode function looks like this :
int main(void)
Node *someNode=NULL;
printf("Enter row 0 data\n");
someNode = createNode();
printf("Some node: %d\n", someNode->cell);
return 0;
【讨论】:
【参考方案2】:这一行
temp->rows[i]->cell=value;
错了。 temp->rows[i]
没有指向任何有效的对象。
你确实为rows
分配了内存,即
temp->rows = malloc(row * sizeof(Node*));
但您从未为 row[0], row[1], ...
分配任何值,因此您正在取消引用未初始化的指针。
【讨论】:
非常感谢,我为此感到非常沮丧,我在 i 中分配了节点内存,现在一切正常!!! 不行,还是错了temp->rows[i]->next=newNode;
一次又一次重新分配第二个节点。以上是关于函数内部结构失效的 Malloc的主要内容,如果未能解决你的问题,请参考以下文章