为什么我不能返回 NULL?

问题描述 投票:0回答:3

我是一个尝试在 c 中学习动态内存分配的初学者

如果文本中没有任何内容,我会尝试返回 NULL,如果其中有内容,我想返回文本。

char* check_for_NULL(const char *text){
    if(text == NULL){
        return NULL;
    }
...
}

(程序的其余部分按预期工作)

如果我把 NULL 放在我调用它的地方:

int main(){
char *check_NULL;

    check_NULL = check_for_NULL(NULL);
    printf("%s", check_NULL);
    free(check_NULL);

}

我得到分段错误而不是空值。

当我在 valgrind 中运行时,我得到了结果:

Invalid read of size 1

Address 0x0 is not stack'd malloc'd or (recently) free'd

试图用 calloc 为 NULL 腾出空间,试图用 0 代替 NULL 但没有任何效果

看到一个类似的帖子:

Valgrind:大小 1 的无效读取

但没有得到解决方法。

c pointers null dynamic-memory-allocation
3个回答
0
投票

如果指针

check_NULL
等于
NULL
那么这个语句

printf("%s", check_NULL);

调用未定义的行为。

至少你应该写

if ( check_NULL != NULL ) printf("%s", check_NULL);

注意使这个陈述正确

free(check_NULL)

函数应该返回空指针或指向动态分配内存的指针。

注意那句话

文中没有任何内容,

表示向函数传递了一个空字符串。要检查一个字符串是否为空,你应该写成 example

if ( text[0] == '\0' )
//...

if ( !*text )
//...

0
投票

替代您的

printf()
的另一种解决方案:

printf( "%s", check_NULL ? check_NULL : "(null)" );

0
投票

看来你想要这样的东西:

char* check_for_NULL(const char *text){
    if(text == NULL){
        return "NULL";
    }
...
}

C 不像 Ruby 或 Python 或其他任何东西。它不会通过魔法将 NULL 指针转换为字符串。

您还在一个未动态分配的指针上调用

free()
。你不需要显式释放那些,只需要通过
malloc()
calloc()
realloc()
分配的东西。像
"NULL"
这样的字符串文字永远存在并且不能被释放。

© www.soinside.com 2019 - 2024. All rights reserved.