yel*_*at5 3 c heap struct segmentation-fault
#include <stdio.h>
#include <stdlib.h>
struct myStruct
{
int number;
};
void
allocateMem(struct myStruct *struct1)
{
struct1 = malloc(sizeof(struct myStruct));
struct1->number = 500;
printf("struct1->number: %d\n", struct1->number);
}
int
main(int argc, char *argv[])
{
struct myStruct *struct1 = NULL;
allocateMem(struct1);
printf("number: %d\n", struct1->number);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
您好,StackOverflow的公民,我寻求您的帮助.
我想要做的是使用堆空间而不是堆栈空间分配结构; 我正在尝试在函数内部进行分配.无论我多么混乱,我总是得到一个分段错误或几个编译器警告.
我在这里做错了什么,但我无法弄清楚是什么,我一直在StackOverflow和一般的互联网试图找到一个与我的问题有关的例子或帖子,但我没有发现任何东西.
如果你能告诉我我做错了什么,或者只是指出我正确的方向,我将非常感激.
感谢大家的快速准确回复.你是对的,我需要一个指针指针,我的代码现在可以帮助你.
小智 5
实际上,指针只是一个整数,当您将 struct1 传递给函数时,因为 struct1 为 null,实际上您只是将 0 传递给函数。该值在堆栈上传递,您进行堆分配并使用新地址更新堆栈值。但是当您从函数返回时,该值就会从堆栈中弹出,并且您已经泄漏了该内存。main 中 struct1 的值(也在堆栈上仍然保持其值 0(NULL)。因此,如果您想更新该值,则必须传入指向指针的指针,或者可能更简单的方法是返回来自函数的 malloc 指针。
这是修改函数以使其工作的一种方法:
#include <stdio.h>
#include <stdlib.h>
struct myStruct
{
int number;
};
struct myStruct*
allocateMem()
{
struct myStruct* struct1 = malloc(sizeof(struct myStruct));
struct1->number = 500;
printf("struct1->number: %d\n", struct1->number);
return struct1;
}
int
main(int argc, char *argv[])
{
struct myStruct *struct1 = allocateMem();
printf("number: %d\n", struct1->number);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在这个功能中,
void
allocateMem(struct myStruct *struct1)
{
struct1 = malloc(sizeof(struct myStruct));
struct1->number = 500;
printf("struct1->number: %d\n", struct1->number);
}
Run Code Online (Sandbox Code Playgroud)
struct1
是按值传递的.您在函数中对它所做的任何更改都不会从调用函数中看到.
一个更好的选择:
struct myStruct* allocateMem()
{
struct myStruct *struct1 = malloc(sizeof(struct myStruct));
struct1->number = 500;
printf("struct1->number: %d\n", struct1->number);
return struct1;
}
Run Code Online (Sandbox Code Playgroud)
将调用函数更改为:
int
main(int argc, char *argv[])
{
struct myStruct *struct1 = allocateMem();
printf("number: %d\n", struct1->number);
// Make sure to free the memory.
free(struct1);
return 0;
}
Run Code Online (Sandbox Code Playgroud)