我遇到过这个问题:我实现了一个函数,将字符串转换为结构。我有这个结构:
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 */
}
但它不起作用。提前感谢您的帮助。
答案 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
将字符串分解为标记,然后使用strtok
或atoi
将每个子字符串转换为整数。