另一个函数中的 Malloc 和赋值
Malloc and Assignment inside another function
我需要帮助来理解为什么这不起作用。
我正在尝试 malloc
并通过另一个函数分配指令和分隔符。在我尝试过的所有方法中,我在第二个作业 *separators[1] = '1'
上遇到 分段错误 ,但由于某种原因,*separators = '2'
有效。
我认为引用指针有些地方我不明白。
这是我的简化代码
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
void split_instructions(char ***instructions, char **separators)
{
int split_len = 2;
*instructions = (char **)malloc(sizeof(char*) * split_len + 1);
if (*instructions == NULL)
return;
*separators = (char *)malloc(sizeof(char) * split_len + 1);
if (*separators == NULL)
{
free(instructions);
return;
}
*separators[0] = (char)'q';
*separators[1] = (char)'1';
//*separators = "22"; <- this work
*instructions[0] = (char*)"test";
*instructions[1] = (char*)"test2";
}
int main(void)
{
char **instructions;
char *separators;
split_instructions(&instructions, &separators);
}
类似
的表达
*separators[1] = (char)'1';
由于 operator precedence., 无法正常工作
[]
运算符的优先级高于 *
运算符,因此它会尝试写入 separators
的第二个元素,而“数组”只有一个元素指出的。
应该这样写
(*separators)[1] = (char)'1';
另请注意
中的分配大小
*instructions = (char **)malloc(sizeof(char*) * split_len + 1);
看起来很奇怪。 + 1
只会增加一个字节的分配大小,而不是一个元素的大小。如果你应该为另一个元素分配,它应该是
*instructions = malloc(sizeof(char*) * (split_len + 1));
或
*instructions = malloc(sizeof(**instructions) * (split_len + 1));
请注意 malloc()
家族的铸造结果是 considered as a bad practice。
我需要帮助来理解为什么这不起作用。
我正在尝试 malloc
并通过另一个函数分配指令和分隔符。在我尝试过的所有方法中,我在第二个作业 *separators[1] = '1'
上遇到 分段错误 ,但由于某种原因,*separators = '2'
有效。
我认为引用指针有些地方我不明白。
这是我的简化代码
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
void split_instructions(char ***instructions, char **separators)
{
int split_len = 2;
*instructions = (char **)malloc(sizeof(char*) * split_len + 1);
if (*instructions == NULL)
return;
*separators = (char *)malloc(sizeof(char) * split_len + 1);
if (*separators == NULL)
{
free(instructions);
return;
}
*separators[0] = (char)'q';
*separators[1] = (char)'1';
//*separators = "22"; <- this work
*instructions[0] = (char*)"test";
*instructions[1] = (char*)"test2";
}
int main(void)
{
char **instructions;
char *separators;
split_instructions(&instructions, &separators);
}
类似
的表达*separators[1] = (char)'1';
由于 operator precedence.,无法正常工作
[]
运算符的优先级高于 *
运算符,因此它会尝试写入 separators
的第二个元素,而“数组”只有一个元素指出的。
应该这样写
(*separators)[1] = (char)'1';
另请注意
中的分配大小*instructions = (char **)malloc(sizeof(char*) * split_len + 1);
看起来很奇怪。 + 1
只会增加一个字节的分配大小,而不是一个元素的大小。如果你应该为另一个元素分配,它应该是
*instructions = malloc(sizeof(char*) * (split_len + 1));
或
*instructions = malloc(sizeof(**instructions) * (split_len + 1));
请注意 malloc()
家族的铸造结果是 considered as a bad practice。