c - (C) 传递给 func 的指针与原始指针不同

标签 c arrays pointers segmentation-fault

我发现自己无法诊断段错误。

我有一个基准函数chrono,它接收一个指向随机生成字符串的指针数组strings,以及一个相应大小的数组。为了进行调试,我打印 strings (指向指针的指针)、strings[1] (其中之一)和 sizes (指针) 。 (当然,我还在 chrono 中打印了一些字符串,并与生成它们的函数中的原始内容进行比较:到目前为止一切都很好。)要进行基准测试的是一个函数将一组字符串送入字符串池:

void pool_store_pack (StringPool * pool,
     char ** strings, size_t * sizes, uint n_new);

为了调试,我在 pool_store_pack 中打印相同的数据。而且值(value)观不同。 strings 已更改,strings[1]size 均为 null。这是一个示例输出:

strings:0x9842fa8 (n°1:0x984200c)
sizes:0x9843f48
some strings: `@PR` `MOB` `TBQ`

strings:0x804a824 (n°1:(nil))
sizes:(nil)
segmentation fault (core dumped)

我试图将错误减少到更简单的形式,但这很困难,因为它是测试代码,而不是应用程序代码,驱动一个自治的库。当我尝试从头开始重现该错误时,我只是得到了预期的指针和指向接收函数中与发送函数中具有相同值的指针的指针。不过,如果有帮助的话,我可以发布 3 个相关函数的代码(但你将无法运行它,因为它只是驱动其他函数)。

我很确定错过了一个明显的点,但看不到它,并且被阻塞和沮丧了几个小时;-) 你能帮忙吗?

编辑:所以,这是涉及的整个代码:

/*  Put pack of strings in pool.
*/
void pool_store_pack (StringPool * pool,
         char ** strings, size_t * sizes, uint n_new) {
   pool_grow(pool, n_new);

   // debug /////////////////////////////////////////////////////////
   printfl("n_new:%u", n_new);
   printfl("strings:%p (n°1:%p)", strings, strings[1]);
   printfl("sizes:%p", sizes);
   printfl("some sizes: %u %u %u", sizes[1], sizes[3], sizes[9]);
   printfl("some strings: '%s' '%s' '%s'", strings[1], strings[3], strings[9]);
   end();

   uint i;
   for (i = 0; i < n_new; i++) pool_store(pool, strings[i], sizes[i]);
}

// generate random strings (constants used here are defined somewhere else)
static char ** data_strings (char ** p_bytes) {
   char * bytes = malloc(n_strings * l * sizeof(char));
   check_mem(bytes);
   char ** strings = malloc(n_strings * sizeof(char *));
   check_mem(strings);
   char * s;
   uint i,j;
   srandom(time(NULL));

   for (i=0; i<n_strings; i++) {
      s = bytes + i*l;
      s[size] = NUL;
      for (j=0; j<size; j++) s[j] = '@' + random()%n_letters;
      strings[i] = s;
   }

   //~ for (i=0; i<n_strings; i++) printf("'%s' ", strings[i]); line();
   printfl("some strings: '%s' '%s' '%s'", strings[1], strings[3], strings[9]);
   * p_bytes = bytes;
   return strings;
}

// benchmark
static void chrono () {
   printfl ("=== chrono pool ===============================================");
   uint i;
   clock_t t1, t2;
   float dt;

   // test data string
   char * bytes;
   char ** strings = data_strings(& bytes);
   // string sizes are all equal to size (3)
   size_t * sizes = malloc(n_strings * sizeof(size_t));
   check_mem(sizes);
   for (i=0; i<n_strings; i++) sizes[i] = size;

   // debug ///////////////////////////////////////////////////////////////////
   printfl("n_strings:%u", n_strings);
   printfl("strings:%p (n°1:%p)", strings, strings[1]);
   printfl("sizes:%p", sizes);
   printfl("some sizes: %u %u %u", sizes[1], sizes[3], sizes[9]);
   printfl("some strings: '%s' '%s' '%s'", strings[1], strings[3], strings[9]);

   // now, feed the pool
   StringPool * pool = stringpool();
   t1 = clock();
   pool_store_pack(pool, strings, sizes, n_strings);
   t2 = clock();
   end();
   dt = 1.0 * (t2 - t1) / CLOCKS_PER_SEC;
   print("pool data   : "); show_pool_data(pool);
   print("pool stats  : "); show_pool_stats(pool, false);
   printfl("time  : %.3f", dt);

   free(bytes);
   free(strings);
}

最佳答案

运行正常!事实上有 2 个 bug,它们相互影响。首先,错误地重新定义了静态常量,给出了要馈送到池中的初始字符串集的大小(实际上只有 "",因此该集合的长度为 1)。其次,反转 2 条指令,使池在初始化之前就被使用。交互是初始化还使用 pool_store_pack 向池提供所述初始字符串。

==>

我得到的调试输出(并向您展示)反射(reflect)了为池初始化调用此函数 pool_store_pack 的数据,而不是来自 chrono 函数的数据(因此,strings[1] 为零,因为初始集合中只有一个字符串!)。并且 sizes 为零,因为它是错误更改的静态常量...妈妈咪呀!

谢谢大家!不幸的是我不能投票给你,因为只有评论......

关于c - (C) 传递给 func 的指针与原始指针不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13866992/

相关文章:

c - LabWindows 中的实时数据过滤?

C 结构体指针数组 vs 结构体指针 malloc

c++ - 在 C++ 中将指针数组分配给私有(private)变量

c - 有符号整数溢出是否定义了未定义的行为或实现?

c - 试图解决C程序中的段错误

python - 努力使用面向数组的编程来实现循环

C - 传递给函数的指针不保留指定的字符串

xml - `,omitempty`和Go 's standard ` xml`包中的指针字段

c - 从没有 fileno() 的文件指针获取文件描述符

PHP & WordPress : print array content