如果这是一个"基本"问题,请道歉,但我是C的新手,无法找到答案.我的问题是关于malloc变量的需要并在函数内返回其指针,与在函数内创建变量和return结果相比.
我想到的第一个问题是,一旦函数终止,在函数范围内声明的任何变量都将被销毁; 那么为什么以下是有效的:
int add(int a, int b)
{
int result;
result = a + b;
return result;
}
Run Code Online (Sandbox Code Playgroud)
但以下不是?
char *concat(char* a, char* b)
{
char result[10];
strcat(result, a);
strcat(result, b);
return result;
}
Run Code Online (Sandbox Code Playgroud)
你得到的警告是你正在向一个局部变量返回一个地址,但这是我们在第一个函数中也在做什么的?行为是否因类型而异?
对于一个更实际的例子,我非常困惑我应该使用以下哪两个函数,因为它们对我的程序都非常有效:
struct Card *card_create(enum Rank rank, enum Suit suit)
{
struct Card *card = malloc(sizeof(struct Card));
if(card == NULL) {
fprintf(stderr, "malloc: %s", strerror(errno));
return NULL;
}
card->rank = rank;
card->suit = suit;
return card;
}
Run Code Online (Sandbox Code Playgroud)
要么:
struct Card card_create(enum Rank rank, enum Suit suit)
{
struct Card card;
card.rank = rank;
card.suit = suit;
return card;
}
Run Code Online (Sandbox Code Playgroud)
再次,对不起,如果这是一个不起眼的问题,但我真的很感激解释.谢谢!
在add()函数中,返回其局部变量中保持的值(直到函数退出)result.函数返回后,该变量的存储不再可用,但存储的值只是一个数字,本身并不取决于该存储.
在concat()函数中,表达式result求值为指向 10的数组的本地存储的指针char.您仍然可以返回指针的值,但是一旦函数退出,则不再定义该值的含义.
所以,不,返回值的行为在这些情况之间本身并不相同,但与此相关的有用性 - 实际上是风险 - 变化很大.
| 归档时间: |
|
| 查看次数: |
1768 次 |
| 最近记录: |