我正在写一些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);

09-29 23:50