EXC_BAD访问。尝试使用指针按字母顺序排列10个名称

时间:2017-05-01 18:34:21

标签: c

我不明白EXC_BAD_ACCESS错误的含义。

此代码的目的是按字母顺序排列10个名字: 排序并创建一个指向字符串的指针数组,然后通过交换指针而不是实际的字符串进行字母顺序排列。当我运行代码时,出现EXC_BAD_ACCESS错误。

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

int main()
{
    int i;
    char first_name[10];
    for (i=0; i <10 ; i++)
    {
        printf("please enter the number %d name: ", i);
        scanf("%s",&first_name[i]);
    }

//make pointer
    char *dummy;
    dummy = &first_name[0];
    int temp;
    int length;
    char *dummy2;
    int j;
    for (i=1; i<10;i++)
    {
        length = sizeof(first_name[i])/sizeof(char);
        dummy = &first_name[i];
        for (temp=0; temp<length;temp++)
        {
            dummy[temp] = tolower(dummy[temp]);
        }
    }
    for (i=1;i<10;i++)
    {
        dummy2 = &first_name[i];
        for (j=0;j<9;j++)
        {
            int compare = strcmp(dummy2,dummy); //This is where the bad Access error occurs.
            if (compare < 0)
            {
                temp = dummy;
                dummy = dummy2;
                dummy2 = temp;
            }
        }
        dummy = &first_name[i];
        printf("%s",dummy2);
    }
    return 0;
}

1 个答案:

答案 0 :(得分:3)

主要问题是你每次都在同一个字符数组上传递一个指针,只是将地址移一:

scanf("%s",&first_name[i]);

将第一个字符串存储在first_name中,第二个字符串存储在first_name+1中(销毁除第一个字符以外的第一个字符串)并最终覆盖未分配的内存,因为1个字节不足以存储最后一项(当你到达最后一项时,你的char数组溢出):未定义的行为然后发生。

此外,使用length = sizeof(first_name[i])/sizeof(char);计算字符串长度不正确。这里的值为1,因此您的小写循环不执行任何操作。请使用strlen(first_name[i])

最后,我想你要声明一个包含10个100长度字符串的二维数组:

char first_name[10][100];

在其余代码中替换

&first_name[xxx];

通过

first_name[xxx];

以简单的方式获取表格的第xxx个字符串的地址。

BTW:为了提高安全性,请在执行scanf时使用限制:

scanf("%99s",first_name[i]);

所以没有人可以输入超过99个字符并崩溃/利用您的程序。