2016-04-15 44 views
0

我有设定值的结构功能:如何正确地将内存分配给存储在结构中的动态整数数组?

我的结构:

struct entry { 
    char key[MAX_KEY]; 
    int* values; 
    size_t length; 
    entry* next; 
    entry* prev; 
}; 

我的功能:

// Sets entry values 
void command_set(char **commands, int arg_num) { 
    struct entry e; 
    e.length++; 
    strcpy(e.key, commands[1]); 
    for (int i = 2; i < arg_num; i++) { 
     e.values[i - 2] = atoi(commands[i]); 
    } 
} 

其中:

  • **命令:是一串字符串
  • arg_num:是如何许多字符串数组中有
  • 关键:是入门
  • 值的名称:是整数值存储条目

我运行代码,我得到一个分段错误11.我已经收窄它归结为行:

e.values[i -2] = atoi(commands[i]); 

我认为我必须使用malloc分配内存,因为我不似乎已经走了出界与我的循环。我试图理解分配内存的正确方法,但我似乎无法获得将sizeof(int)分配给动态整数数组的正确语法。

我曾尝试:

e.values[i - 2] = malloc(sizeof(int)); 

e.values[i - 2] = (int) malloc(sizeof(int)); 

e.values[i - 2] = malloc(sizeof(int *)); 

但是我得到的错误:

incompatible pointer to integer conversion assigning 
    to 'int' from 'void *' [-Werror,-Wint-conversion] 
+0

这有很多错误,还有一些莫名其妙的东西,比如你打算在'struct entry e'之后做什么。你想实现什么?帮助您解决分配和未定义的行为可能无关紧要,因为您目前的方法可能不合适。尝试显示您的程序中正在使用的此代码的完整示例。 – paddy

回答

4

您必须分配整个数组:

e.values = malloc(sizeof(int) * (arg_num - 2)) 

重要:记得拨打free当你与内存中完成,否则将有内存泄漏。


你有另一个问题,虽然与你所询问的无关。

你做

struct entry e; 
e.length++; 

当结构对象e的定义,它是未初始化,其所有成员将有不确定值。以任何方式使用这些未初始化的数据除了初始化它将导致未定义的行为。而你当你做e.length++时使用这种未初始化的值。

这种增加在代码中没有任何意义,因为您显示它。另一方面,由于变量e及其所有数据将在函数返回时简单地“消失”,因此该函数无论如何都没有多大意义。所以我只能假设它不是你向我们展示的完整功能。

要初始化结构为全零,根本就

struct entry e = { 0 }; 
+0

这个工作,但是我可能问你是否分配整个数组的内存为基础,你将不得不输入多少个整数? – joshuatvernon

+1

@joshuatvernon这就是倍增的目的。你似乎在数组中使用了'arg_num - 2'值,所以我用这个数字乘以'int'的大小。 –

1

修改函数如下。

void command_set(char **commands, int arg_num) { 
    struct entry e; 
    e.length++; 
    strcpy(e.key, commands[1]); 
    //here is the memory allocation 
    e.values = malloc(arg_num-1 * sizeof(int)); 
    for (int i = 0; i < arg_num-1; i++) { 
     e.values[i] = atoi(commands[i+1]); 
    } 
} 
2

为你的结构如下:

struct entry { 
    char key[MAX_KEY]; 
    int* values; 
    size_t length; 
    entry* next; 
    entry* prev; 
}; 

那么你应该喜欢,如果你有10个值,那么你分配10级* 4级的值分配内存以它作为

e.values =(int *)malloc(arg_num*sizeof(int)); 

它。 和自由调用它

free(e.values) 

中时电子或e.values不再有用。欲了解更多信息,你可以see here