c - 为什么 char *str;被宣布为越界

标签 c pointers segmentation-fault

我正在尝试调试这个作为另一个程序的一部分的函数,我从出现在 watch 窗口越界。当我将 strcmpstr 作为参数一起使用时,会发生错误。我究竟做错了什么?

char **merge(int R, int C, char ***mat)
     {
         char **tmp;
         char *str;
         int *trace, i=0, j, min;

         tmp = (char **)malloc(R * C * sizeof(char *));
         if(tmp == NULL)
         {
             fprintf(stderr, "Memory allocation error\n");
             exit(EXIT_FAILURE);
         }

         trace = (int *)malloc(R *sizeof(int));
         if(trace == NULL)
         {
             fprintf(stderr, "Memory allocation error\n");
             exit(EXIT_FAILURE);
         }

         for(i = 0; i < R; i++)
         {
             trace[i] = 0;
         }

         i = 0;
         while(i < (R*C))
         {
             for(j = 0; j < R; j++)
             {
                 if(trace[j] < C)
                 {
                    if(strcmp(mat[j][trace[j]], str) < 0 )
                     {
                        str = mat[j][trace[j]];
                        min = j;
                     }
                 }
             }
             tmp[i++] = mat[min][trace[min]];
             trace[min]++;
         }

         free(trace);
         return tmp;
     }

更新:为什么第二段代码(教授提供的解决方案)可以工作,但指针也没有初始化?

/*
 *  merge the matrix rows into a sorted array
 */
char **merge_matrix(char ***matrix, int R, int C)
{
  int i, j, min_idx, *idx;
  char **array, *min_word;

  /* allocate the final array, plus an auxiliary one */
  array = (char **)malloc(R * C * sizeof(char *));
  idx = (int *)calloc(R, sizeof(int));
  if ((array == NULL) || (idx == NULL)) {
    printf("Memory allocation error.\n");
    exit(EXIT_FAILURE);
  }

  /* merge the matrix rows */
  i = 0;
  while (i < R*C) {

        min_idx = -1;

        for (j=0; j<R; j++) {

            if (idx[j] < C) {

                if ((min_idx==-1) || (strcmp(matrix[j][idx[j]], min_word)<0)) {
                    min_idx = j;
                    min_word = matrix[min_idx][idx[min_idx]];
                }

            }

        }

        array[i++] = matrix[min_idx][idx[min_idx]++];
    }

  free(idx);
  return array;
}

最佳答案

你声明你的char *:

char *str;

然后将它作为参数传递给函数strcmp():

if (strcmp(mat[j][trace[j]], str) < 0)

然而 str 在此期间没有被赋予任何值,它是undefined

关于c - 为什么 char *str;被宣布为越界,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48229618/

相关文章:

c - 尝试执行 "strrev",来自整数的指针而不进行强制转换

c - 执行直接操作时,输出值与函数内作为参数接收的值不同

c - 从 btree 中删除 - 未分配被释放的指针

C++ 链表指针指向结构崩溃

memory - R XML 包中的 htmlParse() 段错误错误 : 'memory not mapped'

xcode - iOS 应用程序中的间歇性 SIGABRT 和 SIGSEGV 崩溃

c - N 个正方形组成的矩形数量

c - 为什么单步执行代码时 printf 输出没有立即出现?

c - 从 eth0 向 eth1 发送多播

c - 在C中获取数组的大小