2016-01-21 42 views
1

我想创建一个大小为32的动态数组,然后从某个文件中读取整数,并将它们存储在数组中。当数组被填充时,然后将其大小加倍(创建另一个大小两倍,从旧数组中复制元素并释放旧数组),直到输入文件耗尽。在c中创建动态数组

下面是代码:

#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 
#include <string.h> 

#define limit 32 

int main (int argc, char *argv[]) { 

    FILE *file = fopen ("myFile1.txt", "r"); 
    int i = 0, num; 
    int *B, *C; 

    B = malloc (sizeof (int) * limit); 

    while (fscanf (file, "%d", &num) > 0) { 
     if (i < limit) { 
      B[i] = num; 
      i++; 
     } 
     else { 
      C = malloc (sizeof (int) * 2 * limit); 
      memcpy (C, B, limit * sizeof (int)); 
      free (B); 

      B = C; 
      B[i] = num; 
      i++; 
      limit = limt * 2; 
      i++; 
     } 
    } 
    return 0; 
} 

我得到了如下的错误:与第二届“要求作为转让的左操作数左值”:“分段错误”。因为我试图探索与动态数组相关的新可能性,以增加我的知识;通过修改代码来帮助我。

任何帮助将不胜感激。

void *realloc(void *ptr, size_t size) 

而不是这样做:

+0

请修正格式,看来你的限制变量是缺少的。 – Bruce

+0

@Bruce他使用预处理器命令#define来“定义”极限 –

+1

您可以调整一个数组的大小并使用'realloc()'复制其数据:'limit = limit * 2; B = realloc(B,limit * sizeof(int));'。不需要创建一个名为'C'的临时数组。 –

回答

3

您可以为阵列使用realloc()的实际分配更多的内存

{ 
    C=malloc(sizeof(int)*2*limit); 
    memcpy(C,B,limit*sizeof(int)); 
    free(B); 
    B=C; 
    B[i]=num; 
      i++; 
      limit=limt*2; 
    i++; 
     } 

你可以简单地做:

B = realloc(B,new_size_in_bytes); 

谈论你的代码:

预编译器命令#define将在编译之前将每个出现的单词“limit”替换为与它相关的值(在本例中为32)。所以在运行时你不能真的改变宏的值。如果你想这样做,我的建议不是定义限制,而是使用一个变量。 关于segfault我没有一个。确保在.c文件所在的同一文件夹中有名为“myFile1.txt”的文件,并检查是否拼写错误。

+0

我读过,realloc是C++中使用的函数,而不是c。 – Trisha

+0

http://www.tutorialspoint.com/c_standard_library/c_function_realloc.htm –

+0

@Trisha我对C++有很少的经验,但我可以向你保证realloc是调整C中数组大小的正确方法。 –