gpt4 book ai didi

c - realloc() 用于 C 中结构指针

转载 作者:行者123 更新时间:2023-11-30 19:32:03 24 4
gpt4 key购买 nike

我遇到过这个问题:我实现了一个函数,希望将字符串转换为结构。我有这样的结构:

typedef struct {
unsigned a, b;
unsigned c, d;
} struct_t;

该函数的标题如下:

struct_t * string_to_struct (char * g)

\retval p 指向创建的新结构的指针;\retval 如果转换不成功则为 NULL。对于“5 8 10 10”等字符串,转换不成功(我收到 segmentation fault 错误),但对于“5 6 6 7”或“4 5 6 8”等字符串,转换成功。我认为问题在于为结构 p 的指针分配内存。我想到首先以这种方式为p分配内存:

p = (struct_t*)malloc(sizeof(struct_t));

然后我考虑为 p 重新分配内存,以便为字符串腾出空间(有些字符串约为 8 个字节,一切正常,但如果字符串约为 10 个字节,我会得到 segmentation fault ,因为通过分配p 的内存如上所述,我只为 8 个字节腾出了空间),使用函数 realloc()扩大内存在哪里放置结构并使其达到字符串的大小,但我不知道如何正确执行。这是我尝试实现该功能的方式,而不是使用 realloc() :

struct_t * string_to_struct (char * g){

struct_t * p; /* pointer to new structure*/
int n;
n = sizeof(g);

if(sizeof(g) > sizeof(struct_t))
p = (struct_t*)malloc(n*sizeof(struct_t));
else
p = (struct_t*)malloc(sizeof(struct_t));

if(g[0] == '\0' ) /* trivial */
return NULL;
else
(*p).a = g[0];
(*p).b = g[2];
(*p).c = g[4];
(*p).d = g[6];

if((*p).a <= (*p).c && (*p).b <= (*p).d) /* check, the elements of the structure must satisfy those relations.*/
return p;
else
return NULL; /* convertion not successful */

}

但是它不起作用。预先感谢您的帮助。

最佳答案

首先,这段逻辑是不必要的:

int n;
n = sizeof(g);

if(sizeof(g) > sizeof(struct_t))
p = (struct_t*)malloc(n*sizeof(struct_t));
else
p = (struct_t*)malloc(sizeof(struct_t));

为结构体的一个实例分配的正确内存量始终是 sizeof(struct_t) 。字符串的长度并不重要。另外,sizeof(g)为您提供指针的大小,而不是字符串的长度。您可以使用 strlen(g) 获得字符串长度。您可以将上面的内容替换为:

p = malloc(sizeof(struct_t));

主要问题在这里:

    (*p).a = g[0];
(*p).b = g[2];
(*p).c = g[4];
(*p).d = g[6];

它的作用是将字符串中特定字符的 ASCII 值(假设您的系统使用 ASCII)作为整数存储到您的结构中。鉴于您的示例输入“5 6 6 7”,g[0]包含字符 '5' 。它的 ASCII 值为 53,因此 p->a值为 53。当您的输入都是单位数字时,您使用的索引对应于数字在字符串中的位置,因此您最终会得到每个数字的 ASCII 值。并且因为字符 '0' 的 ASCII 值至'9'是连续的,您所做的比较将按预期进行。

当您使用“5 8 10 10”这样的字符串时,上述关于数字位置的假设就会被打破。所以a获取'5' (53), b获取'8' (56), c获取'1' (49) 和d得到一个空格(ASCII 32)。那么你的比较(*p).b <= (*p).d)失败,因为 56 不小于 32,所以你的函数返回 NULL 。您可能会遇到段错误,因为调用函数没有检查 NULL 是否有效。已返回。

要正确解析字符串,请使用 strtok将字符串分解为标记,然后使用 atoistrtol将每个子字符串转换为整数。

关于c - realloc() 用于 C 中结构指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47527004/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com