C中char **指针的内存分配

时间:2014-08-13 09:10:56

标签: c arrays string pointers malloc

我必须维护一个字符串数组,每个字符串将包含一个邻居的IP地址。出于某种原因,我需要将它们保持为字符串。

 typedef struct _neighbors
 {
      int num_neigbors;
      char **neighbor_address;
 } neighbors;

假设我要添加两个邻居。

我将char ** neighbor_address视为char *指针数组。

我了解我需要malloc内存neighbor_address[0]neighbor_address[1]来存储他们的IP地址。由于IP地址的形式是" x.y.z.w"我将malloc 7*sizeof (char)

我怀疑的是我应该为基地char **neighbor_address分配多少内存。它应该是4个字节,以便它可以存储neighbor_address[0]的基本指针的IP地址吗?

我之所以这样说是因为如果我没有SIGSEGV,我会得到malloc(细分错误),如下所示:

neighbor_address = malloc (1, sizeof (char *));

我错过了什么?

5 个答案:

答案 0 :(得分:1)

你不应该这样做malloc -

neighbor_address = malloc (1, sizeof (char *));

这里没有遵循malloc的语法。它是calloc的语法。如果您使用的是calloc,则可以使用此方法 -

neighbor_address = calloc (n, sizeof (char *));

如果您想使用malloc请尝试以下更改 -

neighbor_address = (char **)malloc (n * sizeof (char *));
for(i=0;i<n;i++)
neighbor_address[i] = (char *)malloc (8 * sizeof (char));

但你在这里使用结构。因此,您需要使用箭头运算符为char **neighbor_address;分配内存,因为它是指针类型。试试这个 -

neighbors -> neighbor_address = (char **)malloc (n * sizeof (char *)); // n -> no of ip addresses
for(i=0;i<n;i++)
neighbors -> neighbor_address[i] = (char *)malloc (8 * sizeof (char));

答案 1 :(得分:1)

哦,我认为您不了解IP地址的最大长度。 它可以是每个点之间的3位数,因此它最多可以是255.255.255.255

所以为它动态分配内存的代码就是这样:

#define MAX_IP strlen("255.255.255.255")
int i;
neighbors my_neighbors;
my_neighbors.num_neighbors = ?; //Some value that is the num of IP Addresses needed to be stored.
my_neighbors.neighbor_address = malloc(sizeof(char*)*my_neighbors.num_neighbors); //allocate a char* (that is about to be a string) for each neighbor.
for(i = 0 ; i < my_neighbors.num_neighbors ; i++)
{
    my_neighbors.neighbor_address[i] = malloc(sizeof(char)*(MAX_IP+1)); //Allocating enough room in each IP string for 255.255.255.255 + '\0' (null).
}
//Doing some stuff.
//Freeing memory:
for(i = 0 ; i < my_neighbors.num_neighbors ; i++)
{
   free(my_neighbors.neighbor_address[i]);
}
free(my_neighbors.neighbor_address);

就是这样。 希望你能理解。

答案 2 :(得分:0)

您可以像这样分配内存。

neighbor_address = (char**)malloc(num_neighbors * sizeof(char*));
for(i=0; i<num_neighbors; ++i) {
    neighbor_address[i] = (char*)malloc(len_of_address);
}

确保'len_of_address'足够大以存储所有字符(如果您计划存储以\ 0结尾的字符串,则包括终止'\ 0'字符)。 请注意,如果IP地址大于9,则每个ip地址片段需要的空间超过1个字符。

因此,要存储196.168.0.3,您至少需要12个字符。

答案 3 :(得分:0)

首先,两件事:sizeof(char)为1,无论实施如何。我认为你误解了malloc原型。它需要你想要分配的字节数,并返回分配的指针。

如果您想存储x IP,那么您必须这样做:

neighbor_address = malloc(x * sizeof(char*));

然后如果你想在每个字符串中存储7个字符,你必须这样做:

for (i = 0; i < x; i++)
    neighbor_adress[i] = malloc(7 + 1); // 7 chars plus '\0' character

答案 4 :(得分:0)

您必须为num_neighbors个char指针数组分配内存。但最重要的是,请记住# include <stdlib.h>:您使用错误的参数调用malloc,这可能是导致错误大小之前的段错误的原因。

使用malloc的最不容易出错的模式就是这个:

neighbor_address = malloc(num_neighbors * sizeof *neighbor_address);

将相同的变量放在=的左操作数和sizeof的操作数上,并调整元素数。