gpt4 book ai didi

c - sprintf for 循环段错误

转载 作者:太空宇宙 更新时间:2023-11-04 02:16:45 25 4
gpt4 key购买 nike

您好,我需要帮助来理解 sprintf 和 C 字符数组。我来自 Java 背景,理解 C 直到指针(我一直在自学 C :/)。

无论如何,我在使用 sprintf 时遇到段错误,需要回答几个问题。1)sprintf是否覆盖字符数组中的其他元素?如果是这样,不应该将第一个元素设置为 0 来修复它吗?

2) 字符数组用尽空间来放置元素是否属于段错误?

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

来自/lib/i386-linux-gnu/libc.so.6 的 strtod () 中的 0x00238850

0x00000000 在 ?? ()

*编辑抱歉,但我不认为数组初始化是问题所在。对于 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 转换回 double (我可以转换成整数),所以现在我只是将元素存储为字符串,当我需要他们。对此有什么想法吗?

编辑 #2抱歉,伙计们,但我只是缩小了问题范围,实际上问题发生在 ghashtable 插入方法上,我通过了 1 次循环迭代,第二次插入导致段错误。

最佳答案

用尽数组中的空间肯定可能产生段错误——这取决于数组在内存中的位置。但请注意您的数组边界是什么:您从 1 到 nR-1nC-1。 C 有从 0 开始的数组。你确定你正在做你想做的事吗?

关于c - sprintf for 循环段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6657270/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com