C语言 为什么是字符 *str;被声明为越界



我正在尝试调试这个函数,它是另一个程序的一部分,我从指针str收到">分段错误"错误,该错误出现在监视窗口中作为越界。当我使用带有strstrcmp作为参数时,会发生错误。我做错了什么?

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 errorn");
             exit(EXIT_FAILURE);
         }
         trace = (int *)malloc(R *sizeof(int));
         if(trace == NULL)
         {
             fprintf(stderr, "Memory allocation errorn");
             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任何值,它是未定义的

你老师的代码完全没问题,没有任何未初始化的指针访问。

for 循环的第一次迭代中,变量 min_idx 保证为 -1(在上面几行设置为该值(。通过一种称为短路评估的机制(如果您不知道它是什么,请查找它(,if -子句中实际使用未初始化指针min_wordstrcmp部分将仅在min_idx是 -1 以外的任何其他内容时才被计算。

for 循环的任何后续迭代中,min_word 实际上是初始化的。

相关内容

  • 没有找到相关文章

最新更新