gpt4 book ai didi

c - 如何在 C 中使用结构体指针

转载 作者:行者123 更新时间:2023-11-30 16:48:52 25 4
gpt4 key购买 nike

嘿,我是 Stack Overflow 的新手,所以请对我的帖子提出建设性的批评!

我是一名刚接触 c 的高中生(我之前使用过一点 java),我对指针和结构体有点困惑,特别是当它们作为函数之间的参数传递时。我编写了以下代码,该代码可以编译,但在运行时出现段错误(我认为这意味着内存重叠了其分配的空间,如果我错了,请纠正我)。如果有人能解释为什么以及在哪里发生这种情况,那就太好了!

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct savedSite{
char *siteName;
char *date;
int x;
} SAVED_SITE;

void printSite(struct savedSite site){
printf("Site: %s\nDate Added: %s\nID:
% d\n",site.siteName,site.date,site.x);
}

SAVED_SITE* makeNewSite(){
SAVED_SITE returnSite;
printf("Enter Site Name");
scanf("%s", returnSite.siteName);
return &returnSite;
}

int main()
{
SAVED_SITE newSite;
newSite = *makeNewSite();
newSite.date = "3/13/2017";
newSite.x = 89;
return 2;
}

谢谢!

编辑:我对在这里如此快地收到答案感到不知所措!非常感谢你们,太不可思议了!

最佳答案

您的函数 makeNewSite() 导致段错误。

SAVED_SITE* makeNewSite(){
SAVED_SITE returnSite;
printf("Enter Site Name");
scanf("%s", returnSite.siteName);
return &returnSite;
}

变量returnSite是一个局部变量,在堆栈上创建。一旦函数调用结束,该变量就会被销毁。但是,您正在返回其地址并尝试访问它,这会导致段错误。

你可以试试这个:

SAVED_SITE* makeNewSite(){
SAVED_SITE* returnSite = malloc(sizeof(SAVED_SITE));
printf("Enter Site Name");
scanf("%s", returnSite->siteName); // Not sure about this allocation
return returnSite;
}


int main() {
SAVED_SITE* newSite = makeNewSite(); // Get the pointer here.
newSite->date = "3/13/2017";
newSite->x = 89;
free (newSite);
return 2;
}

在此代码中,对 malloc() 的调用将在堆而不是堆栈中创建结构,并且在函数调用后不会销毁该结构。

另请注意,我在主函数中使用 -> 而不是 .。这是因为我有一个指向该结构的指针,而不是该结构本身。 newSite->date(*newSite).date 相同。

关于c - 如何在 C 中使用结构体指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42826371/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com