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



我必须维护一个字符串数组,其中每个字符串将包含邻居的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",我将做7*sizeof (char)malloc

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

我这么说是因为如果我不做malloc,我会得到SIGSEGV(分割错误):

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

我错过了什么?

你不应该这样做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));

哦,我想你没有理解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 + '' (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);

就是这样。

您可以这样分配内存。

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'足够大以存储所有字符(如果您计划存储以结尾的字符串,则包括终止''字符)。请注意,如果ip地址是一个大于9的数字,则每个ip地址片段需要多于1个字符的空间。

所以要存储196.168.0.3你至少需要12个字符

首先,两件事: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 '' character

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

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

neighbor_address = malloc(num_neighbors * sizeof *neighbor_address);

=的左操作数和sizeof的左操作数相同的变量,并调整元素个数

相关内容

  • 没有找到相关文章