我是一个尝试在 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 但没有任何效果
看到一个类似的帖子:
但没有得到解决方法。
如果指针
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 )
//...
替代您的
printf()
的另一种解决方案:
printf( "%s", check_NULL ? check_NULL : "(null)" );
看来你想要这样的东西:
char* check_for_NULL(const char *text){
if(text == NULL){
return "NULL";
}
...
}
C 不像 Ruby 或 Python 或其他任何东西。它不会通过魔法将 NULL 指针转换为字符串。
您还在一个未动态分配的指针上调用
free()
。你不需要显式释放那些,只需要通过 malloc()
、calloc()
和 realloc()
分配的东西。像 "NULL"
这样的字符串文字永远存在并且不能被释放。