错误:函数可以';t返回C中的字符类型

错误:函数可以';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)); 如何返回字符类型?您将返回字符* 注意,这只是返回一个指向书名的指针

我正在尝试制作一个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));
如何返回字符类型?

您将返回字符* 注意,这只是返回一个指向书名的指针。因此,当书被销毁时,指针将失效。不能返回整个标题,因为不能返回数组。如果您想在获得指针后复制字符串(这样它在销毁书本后仍然有效),请使用
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标准与您的说法相矛盾,并将字符串定义为“字符串是以第一个空字符结尾并包含该空字符的连续字符序列”。当然,但是
&
操作符用于完成引用。当然,但是
&
操作符用于完成引用。