【发布时间】:2011-07-11 22:07:00
【问题描述】:
您好,我需要帮助理解 sprintf 和 C 字符数组。我来自 Java 背景,理解 C 到指针(我一直在自学 C :/)。
无论如何,我在使用 sprintf 时遇到了段错误,需要回答几个问题。 1) sprintf 是否覆盖字符数组中的其他元素?如果是这样,不应该将第一个元素设置为 0 修复它吗?
2) char 数组没有足够的空间来放置元素是否属于段错误?
char buffer[15];
char dbuff[15];
char* numer;//these variables don't cause the problem,
// but just thought I'd include them
char* denom;
char** num_ptr = &numer;
char** denom_ptr = &denom;
for(j=1; j < nR; j++)
{
for(i=1;i < nC; i++)
{
sprintf(buffer,"%i",sorts[j][i]); //problems after 1 loop
printf("buffer %s",buffer);
sprintf(dbuff,"%f",srcMat[j][i]);
// a new incoming rank
if(g_hash_table_lookup(rankCnt,buffer) == NULL)
{
avgholder[k++] = sorts[j][i];
printf("%i kkkk %i sorts\n",k,sorts[j][i]);
g_hash_table_insert(rankAvg,buffer,dbuff); //problem occurs here
g_hash_table_insert(rankCnt,buffer, (void*)1);
}
}
我尝试过:添加缓冲区/dbuff[0]=0、memset 和其他几种方法,但我忘记了 :(。我想我需要分配内存,但我从来没有这样做过,这样行吗? 另外我基本上在做的是读取一个二维矩阵的文件,我将它分类,并使用 glib 的 hashmap 来映射它们以进行矩阵操作。任何帮助都会很棒!
程序收到信号SIGSEGV,分段错误。 0x0023af03 在?? () 来自 /lib/i386-linux-gnu/libc.so.6
(gdb) 回溯
0x0023af03 在?? () 来自 /lib/i386-linux-gnu/libc.so.6
0x00238850 in strtod() from /lib/i386-linux-gnu/libc.so.6
0x00000000 在 ?? ()
*EDIT 抱歉,但我认为数组初始化不是问题。对于 srcMat,它的 double srcMat[nR][nC] 其中 nR 和 nC 是整数,即行和列。
对于我使用 int sorts[nR][nC] 的排序;然后我根据矩阵列的排名用整数值填充它。
GHashTable* rankAvg= g_hash_table_new(g_str_hash, g_str_equal);
GHashTable* rankCnt = g_hash_table_new(g_str_hash, g_str_equal);
感谢大家的帮助。
另外,我从 1 开始而不是 0 的原因是输入矩阵文件包含标题行和标题列,这两个东西不需要我的矩阵分位数归一化。
也有点偏离主题,但一个普遍的问题,我无法将 gpointers 转换回双精度数(我可以转换成整数),所以现在我只是将元素存储为字符串,当我存储 atof(double) 时需要他们。对此有什么想法吗?
编辑 #2 对不起,伙计们,但我只是缩小了问题的范围,实际上问题出在 ghashtable 插入方法上,我完成了 1 次循环迭代,第二次插入导致段错误。
【问题讨论】:
-
这个
sorts[][]数组是如何声明的?srcMat[][]也一样 -
您还没有显示
sorts的定义。而且您还没有向我们展示您是如何初始化buffer的。 (请注意,在 C 中,原始类型不会自动初始化为零,除非它们是全局或静态的)。 -
@Oli
buffer初始化并不重要,因为他是 sprintf 的。 -
@hexa:啊,是的,我没有发现这是第一个
sprintf的参数!
标签: c arrays segmentation-fault printf