c - 为什么我会收到以下代码的段错误?

标签 c string

问题是按字母顺序对给定的字符串输入进行升序排序。我为此编写了以下代码。但是在打印输入的名称之后,程序没有对字符串进行排序而是给出了段错误。我在这个问题上花了很多时间,但什么也想不通。任何帮助将不胜感激。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
    int x,i,j,length;
    printf("Enter the number of names you want to sort.\n");
    scanf("%d",&x);
    char *names[x],*p,name[50],*t;
    printf("Enter the names:\n");
    for(i=0;i<x;i++)
    {
        scanf(" %[^\n]",name);
        length = strlen(name);
        p = (char *)malloc(length+1);
        strcpy(p,name);
        names[i] = p;
    }
    printf("Entered names are:\n\n");
    for(i=0;i<x;i++)
    {
        printf("%s\n",names[i]);
    }
    printf("\n\nThe sorted names are:\n");
    for(i=0;i<x-1;i++)
    {

        for(j=i+1;j<x;j++)
        {
            if(strcmp(names[i],names[j])>0)
            {
                strcpy(t,names[i]);
                strcpy(names[i],names[j]);
                strcpy(names[j],t);
            }
        }    
    }
    for(i=0;i<x;i++)
    {
        printf("%s\n",names[i]);
    }
    return 0;
}

最佳答案

你没有分配 t 所以 strcpy(t,names[i]) 会出现段错误。

您还可以使用 strdup()1 来复制您的字符串(而不是 malloc()strcpy())。

而且,由于您的数组是 char* 元素,您可以直接交换它们:

t=names[i];
names[i]=names[j];
names[j]=t;

关于您关于指针的问题,您可以将指针视为 uint32_t:它们“只是”您可以分配的值,就像常规整数一样。只是它们的值被解释为地址,而不是一个随机整数(即它的值对计算机有特殊意义,因为它与内存紧密相关)。

1:如@WhozCraig 所述,strdup() 不是 标准库的一部分,因此您必须#include 适用于您的平台的 header (尽管它确实广泛传播并且几乎不是问题)。

关于c - 为什么我会收到以下代码的段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56603011/

相关文章:

c - fork after malloc in parent...子进程需要释放它吗?

c - 确定某个位是否设置为整数数据类型的最快方法

连接宏名称

c - x64 与 x86 中的内存处理 - C 语言

Python fstring 作为函数

python - 如何在python中拆分匹配模式的字符串

C UDP套接字不工作

python - 从两个字符串获取后缀/前缀修正,将源字符串转换为Python中的目标字符串

c++ - 为什么 visual studio 需要 <string> 来编译,而 codeblocks 不需要?

c++ - 检查迭代器指向字符串的第一个元素