我不明白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;
}
答案 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个字符并崩溃/利用您的程序。