1

我想创建一个指向位数组的指针数组。我使用这个 func2 来测试指针,但是当我尝试访问函数外的位数组的元素时出现段错误。我究竟做错了什么?

int func2(int i,  int* bit_array){

  int j;

  for(j = 0; j< i; j++)
    bit_array[j] = malloc(sizeof(int) * i);  

  for(j = 0; j< i; j++)    
   bit_array[j] = 0;

  return 1;
}

int main(){

 int** bit_root;
 bit_root = malloc(sizeof(int *) * 5);

 func2(5, bit_root);

 int n;
 for(n = 0; n < 5; n++)
   printf("%d ", bit_root[0][n]); //error

 printf("\n");

 return 0;
}
4

2 回答 2

1

您正在向函数发送不正确的数组func2func2需要:

int func2(int i,  int** bit_array){

  int j,k;

  for(j = 0; j< i; j++)
    bit_array[j] = malloc(sizeof(int) * i);  

  for(j = 0; j< i; j++)
    for(k = 0; k< i; k++)  
       bit_array[j][k] = 0;

  return 1;
}

int main(){

 int** bit_root;
 bit_root = malloc(sizeof(int *) * 5);

 func2(5, bit_root);

 int n;
 for(n = 0; n < 5; n++)
   printf("%d ", bit_root[0][n]); //error

 printf("\n");

 return 0;
}
于 2013-11-03T20:36:10.503 回答
0

在下面的行中,您为 bit_array 的每个元素为 int 数组分配内存,并将指向 int 数组的指针分配给 bit_array 元素:

for(j = 0; j< i; j++)
  bit_array[j] = malloc(sizeof(int) * i);  

但是在这里您将零分配给 bit_array 元素。因此,您将指针重写为零,就好像您根本没有分配内存一样:

for(j = 0; j< i; j++)    
  bit_array[j] = 0;

要修复它,请将最后一个块替换为以下代码:

int k;
for(j = 0; j< i; j++)    
  for(k = 0; k < i; k++)
    bit_array[j][k] = 0;

在第一个循环中,您遍历指向 int 数组 (bit_array[j]) 的指针数组,而在内部循环中,您遍历 int 数组 (bit_array[j][k])。这些更改需要更改 func2 定义 - 第二个参数必须是指向 int 指针的指针,而不仅仅是一个指针。它可以帮助您摆脱编译器的警告。要清楚地看到发生了什么,您可以使用以下代码:

int k, *int_array = NULL;
for(j = 0; j< i; j++)
{ 
  int_array = bit_array[j]; // get the pointer to int array   
  for(k = 0; k < i; k++)
    int_array[k] = 0; // assign values to int array
}

并且不要忘记为内部数组和 bit_array 释放所有这些内存。

于 2013-11-03T20:30:42.083 回答