gpt4 book ai didi

c - 为什么我可以在函数后返回 `int` 而不是 `char *` ?

转载 作者:太空宇宙 更新时间:2023-11-04 05:02:02 24 4
gpt4 key购买 nike

我是 C 的新手。我扩展了上一个问题的问题:Strange behavior when returning "string" with C (顺便感谢所有回答或评论该问题的人。)

非常简单:

为什么这样行得通:

#include <stdio.h>

int func() {
int i = 5;
return i;
}

int main() {
printf("%d",func());
}

但不是这个:

#include <stdio.h>

char * func() {
char c[] = "Hey there!";
return c;
}

int main() {
printf("%s",func());
}

From the previous question, logically the int i should not exist too because the function has returned, but why can it still be returned while char c[] cannot?

(它似乎与“Pointers and memory scope”重复,但我想知道更多关于返回 intchar * 之间的区别。 )

最佳答案

问题不是返回 char *,而是返回在堆栈上分配的东西。

如果你为你的字符串分配内存而不是指向函数栈,就不会有问题。像这样:

char * func() {
char c[] = "Hey there!";
return strdup(c);
}

int main() {
char* str = func();
printf("%s", str);
free(str);
}

值得一提的是,在这两种情况下,您都在复制一个值,并且在这两种情况下复制的值都是正确的,但复制值的含义不同

在第一种情况下,您正在复制一个 int 值,并且在您从函数返回后,您正在使用该 int 这将是有效的。但是在第二种情况下,即使您有一个有效的指针值,它也指向一个无效的内存地址,它是被调用函数的堆栈。

根据评论中的建议,我决定为这段代码添加另一个更好的内存分配实践:

#define NULL (void*)0

int func(char *buf, int len) {
char c[] = "Hey there!";
int size = strlen(c) + 1;

if (len >= size) {
strcpy(buf, c);
}

return size;
}

int main() {
int size = func(NULL, 0);
char *buf = calloc(size, sizeof(*buf));
func(buf, size);
printf("%s", buf);
free(buf);
return 0;
}

许多 Windows API 函数中都使用了类似的方法。这种方法更好,因为 owner of pointer 更明显(main in here)。

关于c - 为什么我可以在函数后返回 `int` 而不是 `char *` ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53914527/

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