我的 char ** array2; 数组有什么问题?
当malloc处于main函数时,以下代码正常工作。但是当malloc处于外部功能时...这不起作用。
void function(int *var1 ,int array1[][3], char** array2);
main(){
int var1 = 0
int array1[10][3];
char ** array2;
function(&var1 , array1, array2); //Something wrong in here???
printf("Value of var1: %d\n", var1 ); /*Display 5 - OK*/
printf("Value of array1[0][0]: %d\n", array1[0][0] ); /*Display 6 - OK */
printf("Value of array2[0]: %s\n", array2[0]); /*Error - Function stops here */
return;
}
void function(int *var1 ,int array1[][3], char** array2)
{
int i = 0;
array2= malloc(10 * sizeof(char *));
for(i = 0; i<10; i++)
{
array2[i] = malloc(10 * sizeof(char *));
strcpy(array2[i], "SomeText");
}
*var1 = 5;
array1[0][0] = 6;
printf("Value of var1: %d\n", var1 ); /*Display 5 - OK*/
printf("Value of array1[0][0]: %d\n", array1[0][0] ); /*Display 6 - OK */
printf("Value of array2[0]: %s\n", array2[0]); /*Display "SomeText - OK*/
return;
}
答案 0 :(得分:2)
查看此link。您需要了解函数变量如何在C中传递。变量通过C 中的值传递。
试试这段代码:
void function(int *var1 ,int array1[][3], char*** array2);
int main(int argc, char*argv[]){
int var1 = 0;
int array1[10][3];
char **array2;
function(&var1 , array1, &array2); //Something wrong in here???
printf("Value of var1: %d\n", var1 ); /*Display 5 - OK*/
printf("Value of array1[0][0]: %d\n", array1[0][0] ); /*Display 6 - OK */
printf("Value of array2[0]: %s\n", array2[0]); /*Error - Function stops here */
return;
}
void function(int *var1 ,int array1[][3], char*** array2)
{
int i = 0;
(*array2)= malloc(10 * sizeof(char *));
for(i = 0; i<10; i++)
{
(*array2)[i] = malloc(10 * sizeof(char *));
strcpy((*array2)[i], "SomeText");
}
*var1 = 5;
array1[0][0] = 6;
printf("Value of var1: %d\n", *var1 ); /*Display 5 - OK*/
printf("Value of array1[0][0]: %d\n", array1[0][0] ); /*Display 6 - OK */
printf("Value of array2[0]: %s\n", (*array2)[0]); /*Display "SomeText - OK*/
return;
}
传递价值:(在C中)来自此link。
这解释了为什么变量array2
在您的函数中没有变化。 C中的变量 - 如果它是一个指针并不重要 - 总是按值传递。
希望它有所帮助!
答案 1 :(得分:1)
更改
char ** array2;
带
char * array2;
更改
function(&var1 , array1, array2); //Something wrong in here???
带
function(&var1 , array1, &array2);
你会没事的。
你的问题是你将array2(尽管指针)作为函数中的值传递 这意味着在功能结束后,您所做的任何更改都不会被“看到”。
答案 2 :(得分:0)
在调用你的功能之前你有这些:
(gdb) p/x &array1
$7 = 0x7fffffffe080
(gdb) p/x &array2
$8 = 0x7fffffffe108
(gdb) p/x array2
$9 = 0x0
因此,您的array1
和array2
都位于堆叠中。 array2 没有任何价值。它没有指向任何东西。
让我们现在调用该函数,
函数的调用状态如
function (var1=0x7fffffffe104, array1=0x7fffffffe080, array2=0x0)
预期,因为您的array2
未初始化。
但在函数内部查看array2
所在的位置
(gdb) p/x &array2
$10 = 0x7fffffffe038
(gdb) p/x &array1
$11 = 0x7fffffffe040
将此值与之前的&array2
进行比较。您会看到array2
在两种情况下位于内存的不同区域。此图表将帮助您了解会发生什么:
main()'s stack :
+---------------+
|0x7fffffffe080 |
+---------------+
array1
+---------------+
|0x7fffffffe108 |
+---------------+
array2
function's stack
+---------------+
|0x7fffffffe040 |
+---------------+
array1
+---------------+
|0x7fffffffe038 |
+---------------+
array2
所以我想你已经明白,当你把任何东西传递给一个函数时,它会得到它原来位于自己堆栈中的副本。
对于未初始化的指针,您无法执行任何操作。如果你真的想要更改位于调用者堆栈的指针,则需要将指针传递给原始指针。
让我们说,
int * p; /* now it means */
p:
+---------------+------------+
| 0xABCD | 0x00 |
+---------------+------------+
如果我在foo(&p)
的堆栈中调用类似foo
的函数:
+---------------+------------+
| 0xEFGH | 0xABCD |
+---------------+------------+
现在我们有一个指向原始存储的指针。所以我们可以用它做任何事情。
理解像普通变量指针一样遵循类似的规则非常重要。
您可以使用指向它的指针传递“普通”变量的引用。但是如果你想传递对指针本身的引用,你必须进入另一个间接层。
如果返回指针,可以达到类似的效果。你可以在本地初始化一个指针,将其返回给调用者。