【问题标题】:realloc() for pointer to structure in Crealloc() 用于指向 C 中结构的指针
【发布时间】:2017-11-28 08:26:14
【问题描述】:

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

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

}

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

【问题讨论】:

  • 没有 struct_t 的定义,没有语言标签(C 或 C++),没有代码,没有真正的问题。很抱歉,这真的不清楚,可能很快就会关闭。
  • 分配(除了不必要的演员)很好。该错误很可能在解析中。显示string_to_struct 函数的完整主体。
  • sizeof(g)strlen(g) 非常不同
  • 确认。 (*p).a 太丑了,它有自己的特殊符号:p-&gt;a
  • 鉴于char *g,你认为你从sizeof(g);得到了什么?

标签: c string structure realloc


【解决方案1】:

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

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-&gt;a 的值为 53。当您的输入全部为单个数字时,您使用的索引对应于数字在字符串中的位置,因此您最终得到每个数字的 ASCII 值数字。并且由于字符 '0''9' 的 ASCII 值是连续的,因此您所做的比较可以按预期进行。

当您使用“5 8 10 10”之类的字符串时,上述关于数字位置的假设会中断。所以a 得到'5' (53),b 得到'8' (56),c 得到'1' (49),d 得到一个空格(ASCII 32)。那么你的比较 (*p).b &lt;= (*p).d) 失败,因为 56 不小于 32,所以你的函数返回 NULL。您可能遇到了段错误,因为调用函数没有检查是否返回了 NULL

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

【讨论】:

    猜你喜欢
    • 2018-03-25
    • 2012-07-29
    • 2018-12-03
    • 1970-01-01
    • 2021-07-14
    • 1970-01-01
    • 2016-08-25
    • 1970-01-01
    • 2017-01-04
    相关资源
    最近更新 更多