您好我需要帮助理解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和其他一些方法,但我忘了:(。我想我需要分配内存但是我从来没有这样做过,那会有用吗?我基本上做的是读取一个2d矩阵的文件,我把它分类成各种各样的,并使用glib的hashmap来映射它们来做矩阵操作。任何帮助都会很棒!
编程接收信号SIGSEGV,分段故障。 0x0023af03在? ()来自/lib/i386-linux-gnu/libc.so.6
(gdb)backtrace
0x0023af03在? ()来自/lib/i386-linux-gnu/libc.so.6
来自/lib/i386-linux-gnu/libc.so.6的strtod()中的0x00238850
0x00000000 in ?? ()
*编辑抱歉,但我不认为阵列初始化是问题所在。对于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。编辑#2 对不起家伙,但我只是缩小了问题,实际上问题出现在ghashtable插入方法上,我经历了1次循环迭代,第二次插入导致了段错误。答案 0 :(得分:1)
在C中,数组索引从0开始,而不是从1. 尝试在for循环中初始化 i
和j
为0,你可能正在访问错误的内存,因此seg故障。
编辑如果你故意用1初始化它,那么你应该循环到nR-1
和nC-1
,这样你就不会访问错误的内存。
EDIT2
这一行看起来非常可疑:
g_hash_table_insert(rankCnt,buffer, (void*)1);
尝试在某处声明一个int,赋值为1并将其作为参数传递。如果它是一个你应该传递的int ...这个函数的调用签名怎么样?
int myint = 1;
g_hash_table_insert(rankCnt,buffer, &myint);
答案 1 :(得分:1)
在阵列中耗尽空间肯定可以进行段错误 - 取决于阵列在内存中的位置。但请注意你的数组边界是什么:你从1到nR-1
或nC-1
。 C具有基于0的数组。你确定你在做你想做的事吗?
答案 2 :(得分:1)
我担心lib中有一些bug ...我在某个特定的Gtk +程序中也遇到了一些奇怪的分段错误 - 我不知道有什么意义,因为我在测试中未能返回错误。但是,在我的情况下,分割错误发生在我的malloc 24 * 64字节的内存大小之后,其中24是结构的大小,这不是重点 - 该点是仅在64时发生的错误 - 它适用于所有其他值 - 没有理由64这是唯一的例外!
由于gdb将错误追溯到/lib/i386-linux-gnu/libc.so.6,与您的问题中的源相同 - 尽管它们可能有不同的原因 - 这就是我找到您的原因问题在这里 - 我真的不认为这是因为我的代码也不是你的。