Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用函数初始化结构_C_Struct_Initialization - Fatal编程技术网

C 使用函数初始化结构

C 使用函数初始化结构,c,struct,initialization,C,Struct,Initialization,这是我的主要任务 int main(){ int size = 5; Path Solution; PathInit(&Solution,size); printf("Size: %d\n",Solution.size); printf("top: %d", Solution.top); } 这在我的道路上 typedef struct{ int size; int top; int *item; }Path; 这是我的路 void PathInit(Path *P, int vs

这是我的主要任务

int main(){

int size = 5;
Path Solution;
PathInit(&Solution,size);
printf("Size: %d\n",Solution.size);
printf("top: %d", Solution.top);
}
这在我的道路上

typedef struct{
int size;
int top;
int *item;
}Path;
这是我的路

void PathInit(Path *P, int vsize){
P = (Path *)malloc(sizeof(Path));
P->size = vsize;
P->item = (int *)malloc(sizeof(int)*vsize);
P->top = -1;
}

预期产量为

Size: 5
top: -1
然而,输出是沿着

Size: 3412832
top: 0

有人能解释一下为什么我的结构没有正确初始化吗。此外,这还不是我的全部代码,但我已将问题缩小到这些部分。任何帮助都会很好。谢谢

您正在使用堆栈:

Path Solution;
并传递一个指针:

PathInit(&Solution,size);
因此,您不需要使用
malloc
来保留空间:

void PathInit(Path *P, int vsize){
    P = (Path *)malloc(sizeof(Path)); /* Remove this line */

正如@altermann的回答中所提到的,问题是您弄乱了堆栈存储,这是一种未定义的行为。如果要使用动态分配,则需要将指针传递给指针(顺便说一句),以便在函数中修改它,如:

#include <stdio.h>
#include <stdlib.h>

typedef struct {
    int size;
    int top;
    int *item;
} Path;

void PathInit(Path **P, int vsize) { // pass pointer to pointer so we can modify it
    *P = malloc(sizeof(Path)); // No need (and not recommended) to cast malloc in C
    (*P)->size = vsize;
    (*P)->item = malloc(sizeof(int) * vsize);
    (*P)->top = -1;
}

int main() {

    int size = 5;
    Path* Solution; // this is now a pointer
    PathInit(&Solution, size);
    printf("Size: %d\n", Solution->size);
    printf("top: %d", Solution->top);
    free(Solution->item);
    free(Solution);
}
就这样说吧

Path* Solution;
Solution = PathInit(size);

非常感谢,这真的很有帮助:D
Path* Solution;
Solution = PathInit(size);