sprintf for loop segfault

时间:2011-07-11 22:07:00

标签: c arrays segmentation-fault printf

您好我需要帮助理解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次循环迭代,第二次插入导致了段错误。

3 个答案:

答案 0 :(得分:1)

在C中,数组索引从0开始,而不是从1. 尝试在for循环中初始化ij为0,你可能正在访问错误的内存,因此seg故障。

编辑如果你故意用1初始化它,那么你应该循环到nR-1nC-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-1nC-1。 C具有基于0的数组。你确定你在做你想做的事吗?

答案 2 :(得分:1)

我担心lib中有一些bug ...我在某个特定的Gtk +程序中也遇到了一些奇怪的分段错误 - 我不知道有什么意义,因为我在测试中未能返回错误。但是,在我的情况下,分割错误发生在我的malloc 24 * 64字节的内存大小之后,其中24是结构的大小,这不是重点 - 该点是仅在64时发生的错误 - 它适用于所有其他值 - 没有理由64这是唯一的例外!

由于gdb将错误追溯到/lib/i386-linux-gnu/libc.so.6,与您的问题中的源相同 - 尽管它们可能有不同的原因 - 这就是我找到您的原因问题在这里 - 我真的不认为这是因为我的代码也不是你的。