如何交换指针变量来声明一个大小最初未知的数组?

时间:2013-02-17 06:11:54

标签: c arrays pointers struct

所以我希望有一个最初不知道大小的数组(从命令行中取自用户),但我想让它可以全局访问(在main之外)。

所以这就是我所做的:

 //.h file declaration
 typedef struct res
 {
   int popultaion[NB_TYPE];
   int alive;
   int birthat[NB_TYPE];
 }res_t;

 //.c file
 res_t* res_first = NULL;

 int main(int argc, char* argv[])
 {
    int no_of_mutants = atoi(argv[1]);
    int i,j = 0;
    srand(time()NULL);
    res_t* tem= res_first;
    for(i = 0; i < no_of_mutants; i++)
    {      

       for(j = 0; i < NB_TYPE; i++)
       {             
         tem->popultaion[j] = rand();
       }
       tem++
    }
    //...other code
  }

我遇到了分段错误。当我使用gdb进行调试时,似乎它在这里得到了SIGSEGV。

      tem->popultaion[j] = rand();

我有两个问题:

  1. 这种尝试使用添加指针有效构建数组的形式吗?我在第一次运行时遇到段错误,但地址在技术上应该有效。
  2. 从结构中访问数组成员的方式是否有效? (确定它只是想确定)?
  3. P.S。我知道malloc并且可以使用malloc实现相同的功能,但是我想知道这是在给代码中的其他地方改变之前是什么问题,如果是这样的原因?

2 个答案:

答案 0 :(得分:3)

  

这种尝试使用添加指针有效构建数组的形式吗?我在第一次运行时遇到段错误,但地址在技术上应该有效。

为什么要这样?它是NULL,因此您的代码会调用未定义的行为。当用户输入数组中的项目数时,您需要为其分配内存。

res_first = malloc(sizeof(*res_first) * NUM_OF_ELEMENTS);

当然,使用后将其释放:

free(res_first);

答案 1 :(得分:1)

由于您没有分配任何内存,因此会出现分段错误。您的res_first甚至没有使用NULL初始化,因此它指向随机的内容。您需要调用malloc以在堆上分配具有所需大小的数组。如果您需要稍后重新分配,请查看realloc