我必须维护一个字符串数组,其中每个字符串将包含邻居的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
的左操作数相同的变量,并调整元素个数