【发布时间】:2016-03-19 04:22:54
【问题描述】:
我开始学习C中的struct。今天我发现了一个我无法解决的问题。我有这个代码:
typedef struct fraze
{
char *mostSearch = NULL; // for string from user
double freq;
} s_FRAZE;
int readFraze( )
{
int i = 2, k;
size_t len = 0;
char c;
s_FRAZE *s;
s = (s_FRAZE *)malloc( i * sizeof( int ));
k = 0;
while( (c = getchar()) != '\n')
{
ungetc( c, stdin );
if( scanf( "%lf%c", &s[k].freq, &c) != 2 || c != ':' )
{
return 1;
}
if( k + 1 >= i )
{
i *= 2;
printf("%d\n", i );
s = (s_FRAZE *)realloc( s, i * sizeof( int ));
}
len = getline(&s[k].mostSearch, &len, stdin );
s[k].mostSearch[len-1] = '\0';
k++;
}
return 0;
}
我想在用户不输入“\n”时阅读,但它可以工作 2 倍,然后我得到这个错误 realloc(): invalid next size: 0x0000000001559010 *** 我尝试使用 valgrind 并且有更多错误:
==7662== 大小为 8 的无效写入
==7662== 在 0x56AEBB4:_IO_vfscanf (vfscanf.c:2328)
==7662== by 0x56BBD3A: scanf (scanf.c:33)
==7662== by 0x40089F: readFraze() (main.c:31)
==7662== by 0x400818: main (main.c:15)
==7662== 地址 0x59fe048 是在一个大小为 8 的块分配后的 0 个字节
==7662== 在 0x4C27C0F:malloc (vg_replace_malloc.c:299)
==7662== by 0x400847: readFraze() (main.c:25)
==7662== by 0x400818: main (main.c:15)
==7662==
==7662== 条件跳转或移动取决于未初始化的值
==7662== 在 0x56BFCA2:getdelim (iogetdelim.c:63)
==7662== by 0x40093E: readFraze() (main.c:44)
==7662== by 0x400818: main (main.c:15)
谁能告诉我,我做错了什么?
【问题讨论】:
-
不要将
malloc和朋友的结果投射到 C 中。 -
malloc( i * sizeof( int ));-->malloc( i * sizeof( s_FRAZE ));假设你想要数组中的i元素。 -
与
realloc( s, i * sizeof( int ));相同 -->realloc( s, i * sizeof( s_FRAZE )); -
在调用
malloc()和函数族时,始终检查 (!=NULL) 返回值以确保操作成功 -
编译时,始终启用所有警告,然后修复这些警告。 (对于 gcc,至少使用:
-Wall -Wextra -pedantic)发布的代码不仅会引发大量警告,还会引发一些错误。 IE。在修复所有错误之前,发布的代码将永远不会运行。我看到的唯一可能性是这不是您的真实代码。请贴出真实代码