![](/img/trans.png)
[英]Why doesn't my C compiler warn when I assign a string literal to a non-const pointer?
[英]Why doesn't my function work to adjust my pointer's content, unless i return one to assign it
我的問題是兩者之間有什么區別? 一個是空的,另一個是返回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
不僅ft_grid_gen
更改為map
點; 它還會更改map
本身。
更改map
對呼叫者的影響不超過更改size
。 無論您在調用ft_grid_gen
用作參數的任何變量仍指向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);
(顯然,在這種特定情況下,這種方法遠非理想。)
不同之處在於,第一個函數返回的內容可供以后使用。 在第二個函數中,按值傳遞char**
,然后輸入:
map = (char**)malloc(sq_root * sizeof(char *));
您將新值分配給局部變量map
,該局部變量map
是通過function參數分配的第一個值。 但是,這不會影響main()
的原始char**
變量-因為它是像C中的其他所有內容一樣通過值傳遞的。如果您想更改main()
變量,則應該將指針傳遞給它(即char***
),並在此函數中取消引用它,例如:
*map = (char**)malloc(sq_root * sizeof(char *));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.