为什么返回 NULL 不会破坏函数?
Why doesn't return NULL break a function?
因此,我的任务是制作并返回给定字符串的副本,并在失败的情况下(例如,按回车键(返回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++中应使用运算符new
和delete
而不是 C 函数malloc
和free
。而不是动态创建的字符数组来存储字符串,您应该使用标准C++类std::string
。
相关文章:
- 从函数返回const char*数组
- 检查函数返回类型是否与STL容器类型值相同
- 从 c 或 cpp 系列子函数返回到主函数
- 从函数返回任意简单类型的数据
- 警告:在函数返回类型 [-Wignore 限定符] 时忽略类型限定符
- 从 C++ 中的函数返回数组地址问题
- VirtDisk.h QueryChangesVirtualDisk() 函数返回 RangeCount 为 0
- 为什么glGetSubroutineIndex为不同的函数返回相同的值?
- 在 c++ 中将函数返回类型指定为模板参数
- 从封装在对象中的函数 C++ 返回时为空的列表
- 为什么向量内部的指针在从函数返回时会发生变化?
- 函数返回的 rvalue 引用(表达式)是 xvalue - 但没有标识?
- 程序中的布尔函数返回输入的范围无论如何都是无效的
- 寿命延长从函数返回引用
- 程序不向函数返回值
- 字符串函数返回奇怪的值
- 类的大问题,以及从空函数c++返回
- 为什么在尝试测量函数返回所需的时间时,我的运行时编号是错误的?
- C++二叉搜索树模板从函数返回节点
- NVCC 错误:string_view.h:constexpr 函数返回是非常量