为什么返回 NULL 不会破坏函数?

Why doesn't return NULL break a function?

本文关键字:函数 返回 NULL 为什么      更新时间:2023-10-16

因此,我的任务是制作并返回给定字符串的副本,并在失败的情况下(例如,按回车键(返回NULL。但是,当我按 Enter 键时,程序继续工作并打印出一些垃圾值。不过有趣的事实是,当我通过调试器运行它时,该程序运行良好(这让我最担心(。我找不到一个简单的解释来解释可能出了什么问题。还是我的编译器有问题?

#include <stdio.h>
#include <stdlib.h>
// listing functions
char *ft_strdup(char *src);
int main(void)
{
// input of a string
char c[200];
scanf("%[^n]%*c", c);
// calling a function
char *f = ft_strdup(c);
printf("n%sn", f);
free(f);
return 0;
}
char *ft_strdup(char *src)
{
int i = 0;
// itearting to get the 'length' of string src
while (src[i] != '')
++i;
// if user has inputted nothing - return NULL and break the function
if (i == 0)
{
return NULL;
}
// otherwise, make a copy of the string
char *x = malloc(i+1);
int j = 0;
while (j != i)
{
x[j] = src[j];
++j;
}
x[i+1] = '';
// print out and return
printf("%sn%sn%i", x, src, i);
return x;
}

它打印垃圾值,因为字符 c[200]; 未初始化,这意味着它里面有垃圾值。

char c[200] = {0}; 

试试这个,可能会因为 NULL 指针访问而崩溃。

添加此内容以避免崩溃

if (f != NULL) {
printf("n%sn", f);
free(f);
}

该程序具有未定义的行为,原因有两个。

第一个是数组c未初始化

char c[200];

因此,它具有不确定的值,如果用户只需按 Enter 键,则数组不会更改。

你可以用C++初始化它,比如

char c[200] = {};

或在 C 中类似

char c[200] = { '' };

或者就像

char c[200] = "";

;

第二个是您在函数ft_strdup中访问超出分配数组的内存。

x[i+1] = '';

你必须写

x[j] = '';

并且您必须检查函数的返回值。

请注意,在C++中应使用运算符newdelete而不是 C 函数mallocfree。而不是动态创建的字符数组来存储字符串,您应该使用标准C++类std::string