realloc()用于指向C中的结构

时间:2017-11-28 08:26:14

标签: c string structure realloc

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

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 */

}

但它不起作用。提前感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

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

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)存储到结构中作为整数。根据您的示例输入&#34; 5 6 6 7&#34;,g[0]包含字符'5'。它的ASCII值为53,因此p->a的值为53.当您的输入是所有单位数字时,您使用的索引对应于数字在字符串中的位置,因此您最终得到ASCII值每个数字。并且因为字符'0''9'的ASCII值是连续的,所以您可以按预期进行比较。

当您使用类似&#34; 5 8 10 10&#34;的字符串时,上述关于数字位置的假设会中断。因此a获得'5'(53),b获得'8'(56),c获得'1'(49),{{1获取一个空格(ASCII 32)。然后您的比较d失败,因为56不小于32,因此您的函数返回(*p).b <= (*p).d)。您可能会收到段错误,因为调用函数不会检查是否返回了NULL

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