我正在写一些C代码,我遇到了以下问题假设我们有一个非常简单的程序:
#include <stdio.h>
#include <stdlib.h>
struct this {
char* str;
};
char* freeStrReturnPointer(struct this * t) {
free(t->str);
return t->str;
};
int main() {
// standard mallocing going on
struct this* t = malloc(sizeof(struct this));
t->str = malloc(sizeof(char)*10);
// here is the problematic part!
freeStrReturnPointer(t) = NULL;
// end of problematic part
free(t);
exit(0);
}
编译会产生以下问题:
test.c: In function ‘main’:
test.c:18:29: error: lvalue required as left operand of assignment
freeStrReturnPointer(t) = NULL;
我的问题是:如果函数freeStrReturnPointer返回一个指针char*,为什么不能将其设置为NULL?以下方法肯定有效:
char* p;
p = NULL;
这里有什么区别为什么我不能立即为返回的指针赋值?
注意:我知道我可以在函数中将指针设置为空,但这不是问题的关键。
最佳答案
您不能这样做,因为表达式freeStrReturnPointer(t)
返回一个r值,该值需要分配给一个变量,以便在其生存期内扩展到包含它的完整表达式之外。从字面上说,将它赋给“null”没有明显的副作用,而且很可能是程序员的错误,因此语言将其视为错误。
相反你应该这样做
char * p = freeStrReturnPointer(t);
p = NULL;
然后,在这两个表达式中,
p
是第一个表达式中的l值,freeStrReturnPointer(t)
是第一个表达式中的r值,NULL
是第二个表达式中的r值。或者,您可以将
freeStrReturnPointer(t)
视为一个void函数而忽略结果(因为您无论如何都不使用它,所以没有理由将其设置为NULL
):(void) freeStrReturnPointer(t);