2

我的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;

}
4

3 回答 3

2

看看这个链接。您需要了解函数变量如何在 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 中)从此链接

  • 在此方法中传递变量的值。对形式的更改不会影响实际参数。
  • 将为这两个变量创建不同的内存位置。
  • 这里将在函数堆栈中创建临时变量,它不会影响原始变量。

这就解释了为什么你的变量array2在你的函数中没有改变。C 中的变量——不管它是否是指针——总是按值传递。

希望能帮助到你!

于 2012-07-29T07:35:24.197 回答
1

改变

char ** array2; 

char * array2;  

改变

function(&var1 , array1, array2); //Something wrong in here???  

function(&var1 , array1, &array2); 

你会没事的。

您的问题是您将array2(尽管是指针)作为函数中的值传递。
这意味着您对它所做的任何更改在函数结束后都不会“看到”。

于 2012-07-29T07:42:32.537 回答
0

在调用你的函数之前,你有这些:

(gdb) p/x &array1
$7 = 0x7fffffffe080
(gdb) p/x &array2
$8 = 0x7fffffffe108
(gdb) p/x array2
$9 = 0x0

所以你array1array2两者都驻留在堆栈中。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)then的函数:foo

+---------------+------------+
| 0xEFGH        |  0xABCD    |
+---------------+------------+

现在我们有了一个指向原始存储的指针。所以我们可以用它做任何事情。

了解像普通变量指针一样也遵循类似的规则非常重要。

您可以通过指向它的指针传递“普通”变量的引用。但是,如果您想传递对指针本身的引用,则必须进行另一层间接。

如果你返回一个指针,你可以达到类似的效果。您可以在本地初始化一个指针并将其返回给调用者。

于 2012-07-29T09:01:58.037 回答