通过将此数组传递给函数,c malloc为二维char数组

时间:2012-07-29 07:27:25

标签: c arrays char malloc

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

}

3 个答案:

答案 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

因此,您的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)的堆栈中调用类似foo的函数:

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

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

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

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

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