c - 当我在同一个指针中使用 malloc() 两次时会发生什么?
问题描述
我编写了一个代码来按分隔符拆分字符串。我希望函数获取一个字符串并返回它的字符串分割。
它实际上有效,除了一件事。当我给字符串“test”时,它起作用了。但是当我给出字符串“1234 4567”时,我可以访问值“4567”,但不能访问“1234”。(垃圾值。)也“1234 2345 3456 ...”仅在第一个参数“1234”中产生垃圾值。
我认为使用 malloc() 两次会导致同一个指针出现问题,但事实并非如此。我的代码有什么问题?
char **ft_set_char(char *str)
{
int i;
int j;
int k;
char *str_c;
char **ret;
k = 0;
j = 0;
ret = (char **)malloc(10);
str_c = (char *)malloc(5);
i = 0;
while (*(str + i) != '\0')
{
if (*(str + i) == ' ')
{
*(str_c + k) = '\0';
k = 0;
*(ret + j) = str_c;
j++;
i++;
str_c = (char *)malloc(5);
}
*(str_c + k) = *(str + i);
i++;
k++;
}
*(str_c + k) = '\0';
*(ret + j) = str_c;
*(ret + j + 1) = NULL;
return (ret);
}
解决方案
ret = (char **)malloc(10);
这是不正确的,因为它分配了 10 个字节而不是 10 个char *
元素。它应该是:
ret = malloc(10 * sizeof *ret);
其他不相关的问题,但应注意最佳实践:
- 不要投射结果
malloc
- 不要使用 和 之类的幻
10
数5
。对于前者,至少使用一个#define MAX_ARRAY_SIZE 10
. 对于后者,您可以保持计算要从原始字符串复制的字符串的确切大小str
- 这将使您的代码更加健壮,以防它与更长的子字符串一起使用。
推荐阅读
- python - 我正在尝试在 colab 中使用 tkinter,问题就像基本的标记表生成一样我收到了这个错误
- regex - 具有反向引用的相同发送者和接收者的 Bash 正则表达式
- docker - 从 cloud-builders/docker 步骤中登录私有注册表失败 - 证书由未知机构签名
- flutter - 为什么不能在颤振的主要中使用await getTemporaryDirectory
- karate - 空手道脚本命令中的java脚本代码不起作用
- serverless-framework - 触发器的无服务器框架
- c++ - 如何可移植地加载动态库并运行它们的初始化代码?
- .net-core - 在 AutoMapper 中将实体映射到 DTO 时出错
- wordpress - 第一次尝试登录的访问者总是显示 cookie 错误
- android - 对话框弹出很慢