c - 使用指针到指针概念应用冒泡排序?

标签 c

我正在使用冒泡排序对数组按字母顺序排序,同时应用指针到指针的概念。当我使用 strcpy 函数使用指向指针 **p[4] 的指针交换数组 *b[4] 的地址时,我的程序崩溃了,除此之外,程序运行正常。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int main()
 {
   char a[][10]={"milk","eggs","bread","cheese"};
   char *b[4],**p[4],*temp;
   int length[4];
   int i,j;

   for(i=0;i<4;i++)
   {
      length[i]=strlen(a[i]);
      b[i]=(char *)calloc(length[i],sizeof(char));
      strcpy(b[i],a[i]);
      p[i]=&b[i];
    }

  for(j=0;j<4;j++)
   {
     for(i=0; i<3-j; i++)
      {
        if(strcmp(*p[i],*p[i+1])>0)
          { /*         
            strcpy(temp,*p[i]);    This is the part of the code where the  
            strcpy(*p[i],*p[i+1]); program crashes, can someone please point            
            strcpy(*p[i+1],temp);  out the logical flaw
             */
          }
       }
    }  

  for(i=0;i<4;i++)
   {
    puts(*p[i]);
   }  


}

最佳答案

程序崩溃的原因是您试图将 C 字符串的内容复制到未初始化的指针 temp 中,从而导致未定义的行为。

即使您通过为 temp 提供适当长度的缓冲区来解决此问题,在将较长字符串复制到为较短字符串分配的空间中时,您也会遇到未定义的行为(例如,当复制 "cheese " 进入为“eggs”分配的空间)。此外,您当前的实现目前也有未定义的行为,因为它无法分配足够的空间来容纳字符串的空终止符。

解决此问题的正确方法是交换指针,而不是使用它们来复制内容。

关于c - 使用指针到指针概念应用冒泡排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47143733/

相关文章:

c - 为什么我的代码没有运行?

在 Vista 上捕获 "The program stopped working"

c - 复制指针时出现段错误

c - gcc 检查的 printf() 包装器参数

c - 逐个字符地打印一个字符串,在每个字符后延迟

c - 推荐的*最小*椭圆曲线库

c - 运行时检查失败 #2 - 变量 'start' 周围的堆栈已损坏

c - 有没有办法找出指针指向什么类型的结构?

ios - 按位右移 >> 在 Objective-C 中

c - 音频中的采样率是什么意思