错误:函数可以';t返回C中的字符类型
我正在尝试制作一个ADT,但是当我创建了一个返回char类型的函数时,程序无法运行。这是ADT:错误:函数可以';t返回C中的字符类型,c,data-structures,C,Data Structures,我正在尝试制作一个ADT,但是当我创建了一个返回char类型的函数时,程序无法运行。这是ADT: typedef struct{ int ID; char Writer[100]; char Title[100]; long Year; }Book; 功能是: char GetTitle(Book B){ return B.Title; } 我使用它来获取函数的返回值: printf("%s",GetTitle(B)); 如何返回字符类型?您将返回字符* 注意,这只是返回一个指向书名的指针
typedef struct{
int ID;
char Writer[100];
char Title[100];
long Year;
}Book;
功能是:
char GetTitle(Book B){
return B.Title;
}
我使用它来获取函数的返回值:
printf("%s",GetTitle(B));
如何返回字符类型?您将返回字符*
注意,这只是返回一个指向书名的指针。因此,当书被销毁时,指针将失效。不能返回整个标题,因为不能返回数组。如果您想在获得指针后复制字符串(这样它在销毁书本后仍然有效),请使用strdup
:
Book* B = malloc(sizeof(Book));
// [...] initialize the book...
char *title = strdup(GetTitle(B));
free(B);
printf("%s",title);
free(title);
编辑:如果strdup
不可用,请检查实现。返回字符*
注意,这只是返回一个指向书名的指针。因此,当书被销毁时,指针将失效。不能返回整个标题,因为不能返回数组。如果您想在获得指针后复制字符串(这样它在销毁书本后仍然有效),请使用strdup
:
Book* B = malloc(sizeof(Book));
// [...] initialize the book...
char *title = strdup(GetTitle(B));
free(B);
printf("%s",title);
free(title);
编辑:如果strdup不可用,请检查实现。您必须阅读编译器传递的警告:确保它告诉您不能从函数堆栈返回地址。它的工作纯属偶然,因为在函数返回后,内存无效。您必须继续使用指针和引用。尝试更改char GetTitle(B书)代码>到
char*GetTitle(Book*B)代码>,如下所示:
#include <string.h>
#include <stdio.h>
typedef struct {
int ID;
char Writer[100];
char Title[100];
long Year;
} Book;
char* GetTitle(Book *B) {
return B->Title;
}
int main() {
Book B;
strcpy(B.Title, "Title");
printf("%s\n", GetTitle(&B));
return 0;
}
#包括
#包括
类型定义结构{
int-ID;
字符写入器[100];
字符标题[100];
长年;
}书;
char*GetTitle(书*B){
返回B->Title;
}
int main(){
B册;
strcpy(B.标题,“标题”);
printf(“%s\n”,GetTitle(&B));
返回0;
}
您必须阅读编译器传递的警告:确保它告诉您不能从函数堆栈返回地址。它的工作纯属偶然,因为在函数返回后,内存无效。您必须继续使用指针和引用。尝试更改char GetTitle(B书)代码>到char*GetTitle(Book*B)代码>,如下所示:
#include <string.h>
#include <stdio.h>
typedef struct {
int ID;
char Writer[100];
char Title[100];
long Year;
} Book;
char* GetTitle(Book *B) {
return B->Title;
}
int main() {
Book B;
strcpy(B.Title, "Title");
printf("%s\n", GetTitle(&B));
return 0;
}
#包括
#包括
类型定义结构{
int-ID;
字符写入器[100];
字符标题[100];
长年;
}书;
char*GetTitle(书*B){
返回B->Title;
}
int main(){
B册;
strcpy(B.标题,“标题”);
printf(“%s\n”,GetTitle(&B));
返回0;
}
B.Title
是字符数组char*
类型。B.Title
具有类型char[100]
。编译器无法将其(即使在自动转换为char*
)转换为类型char
。请尝试更改char GetTitle(B书)代码>到char*GetTitle(Book*B)代码>。出现了什么错误?应该尝试传递指向结构的指针,而不是结构本身:char GetTitle(Book*B)
B.Title
是字符数组char*
类型。B.Title
具有类型char[100]
。编译器无法将其(即使在自动转换为char*
)转换为类型char
。请尝试更改char GetTitle(B书)代码>到char*GetTitle(Book*B)代码>。出现了什么错误?应该尝试传递指向结构的指针,而不是结构本身:char GetTitle(Book*B)代码>。它的工作只是偶然的。结构B不是通过引用传递的,因此从技术上讲,GetTitle(B)
返回的地址无效。永远不要这样做。改为将函数的参数类型从Book
更改为Book*
。谢谢,@Giovanni。我是如此专注于返回类型,以至于我没有注意到这个问题。我改变了我的答案。你为什么做免费的?还要注意,strdup
不是标准函数。最后你还需要调用free(title)
。C中没有字符串。字符串只是指向char
数组的第一个char
的指针。@Giovanni C标准与您的说法相矛盾,将字符串定义为“字符串是以第一个空字符结尾并包含该空字符的连续字符序列”。它的工作纯属偶然。结构B不是通过引用传递的,因此从技术上讲,GetTitle(B)
返回的地址无效。永远不要这样做。改为将函数的参数类型从Book
更改为Book*
。谢谢,@Giovanni。我是如此专注于返回类型,以至于我没有注意到这个问题。我改变了我的答案。你为什么做免费的?还要注意,strdup
不是标准函数。最后你还需要调用free(title)
。C中没有字符串。字符串只是指向char
数组的第一个char
的指针。@Giovanni C标准与您的说法相矛盾,并将字符串定义为“字符串是以第一个空字符结尾并包含该空字符的连续字符序列”。当然,但是&
操作符用于完成引用。当然,但是&
操作符用于完成引用。