c - 为什么我的函数不能调整指针的内容,除非我返回一个来分配它
问题描述
我的问题是这两者有什么区别?一个是 void,另一个返回 2d 数组,但是它们的作用相同,但功能似乎不一样?我一定是误解了这里的指针。
我认为指针只存储一个指向的地址,所以如果我将一个作为参数传递,并更改内容及其指向的位置,我不做与将其重新分配给函数返回值相同的操作。
在我们打印第一行的两个函数的末尾,他们都这样做了。但是在我的 Main 中通过 void 函数打印调整后的网格时,我得到了一个段错误。
char **ft_grid_gen(int size)
{
char **map;
int index;
int elem_index;
int sq_root;
index = 0;
elem_index = 0;
sq_root = ft_sqrt(size * 4);
map = (char**)malloc(sq_root * sizeof(char *));
while (index < sq_root)
{
map[index] = (char*)malloc(sq_root * sizeof(char));
while (elem_index < sq_root)
{
map[index][elem_index] = '.';
elem_index++;
}
index++;
elem_index = 0;
}
printf("GENERATED NEW GRID of size %s!\n", map[0]);
return (map);
}
void ft_grid_gen(char **map, int size)
{
int index;
int elem_index;
int sq_root;
index = 0;
elem_index = 0;
sq_root = ft_sqrt(size * 4);
map = (char**)malloc(sq_root * sizeof(char *));
while (index < sq_root)
{
map[index] = (char*)malloc(sq_root * sizeof(char));
while (elem_index < sq_root)
{
map[index][elem_index] = '.';
elem_index++;
}
index++;
elem_index = 0;
}
printf("GENERATED NEW GRID of size %s!\n", map[0]);
}
解决方案
请注意,ft_grid_gen
不要只是将其更改为哪些map
点;它也会改变map
自己。
更改map
对调用者的影响并不比更改更大size
。无论您在调用者中用作参数的任何变量在ft_grid_gen
.
如果要通过参数返回值,则需要将指针传递给将接收该值的变量。
void f(int *i_ptr) {
*i_ptr = 123;
}
int i;
f(&i);
在你的情况下,这将是
void ft_grid_gen(char ***map_ptr, int size) {
...
*map_ptr = map;
}
char **map;
f(&map);
或者,您可以在外部分配内存。由于函数不再需要更改map
,因此map
可以直接传递 的值。
void ft_grid_gen(char **map, int size) {
...
}
char **map = malloc(ft_sqrt(size * 4) * sizeof(char*));
ft_grid_gen(map, size);
(显然,在这种特定情况下,这种方法远非理想。)
推荐阅读
- arrays - Swift:使用 UUID 从数组中删除重复对象
- excel - Excel VBA函数从一个范围内获取正值
- reactjs - 如果 Next.js ISR 的 revalidate 值为 1 秒在生产中会发生什么?
- node.js - 异步 Json 数组矩阵
- java - 为什么这个最大公约数的输出为 0
- node.js - 为什么我在安装 npm 包时会出现此错误?
- rust - 如何使用不安全代码对数组中的同一元素进行多个可变引用?
- python - python中的语音识别.ogg文件
- flutter - 我无法为我的颤振项目获取依赖项 - Flutter pub get issues
- python - 比较具有不同列名的两个数据框,并使用来自第二个数据框的列更新第一个数据框