簡體   English   中英

為什么我的以下代碼出現分段錯誤?

[英]Why am I getting segmentation fault for the following code?

問題是要按字母升序對給定的字符串輸入進行字母排序。 我為相同的代碼編寫了以下代碼。 但是,在打印輸入的名稱后,該程序而不是對字符串進行排序會產生分段錯誤。 我在這個問題上花了很多時間,但什么也沒辦法。 任何幫助,將不勝感激。

#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適用於您平台的標頭(盡管它確實廣泛傳播,但幾乎沒有問題)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM