我想得到你的帮助。我正在调试我的代码,我发现编译器在这一行将我踢出
if(strcmp(text1[i],text1[i+1]) > 0 )
我得到的错误消息是
Unhandled exception at 0x542ed442 (msvcr100d.dll) in LB11_12.exe: 0xC0000005: Access violation reading location 0xfdfdfdfd.
然后它问我是想中断还是继续为什么会这样?
这是我的代码
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
#include <malloc.h>
#define LINES 4
#define length 100
void SortText1(char **text1);
void SortText2(char **text2);
void PrintStr1(char **text1);
void PrintStr2(char **text2);
void main ()
{
int i;
char **text1;
char **text2;
char **text3;
text1=(char **)malloc(LINES*sizeof(char *));
if(!text1) // Terms - if there is not enough memory,print error msg and exit the program.
{
printf("alloc failed\n");
return ;
}
for (i=0 ; i<LINES; i++)
{
text1[i] =(char*) malloc(length*sizeof(char));
}
text2=(char **)malloc(LINES*sizeof(char *));
if(!text2) // Terms - if there is not enough memory,print error msg and exit the program.
{
printf("alloc failed\n");
return ;
}
for (i=0 ; i<LINES; i++)
{
text2[i] =(char*) malloc(length*sizeof(char));
}
text3=(char **)malloc((LINES+LINES)*sizeof(char *));
if(!text3) // Terms - if there is not enough memory,print error msg and exit the program.
{
printf("alloc failed\n");
return ;
}
for (i=0 ; i<LINES+LINES; i++)
{
text3[i] =(char*) malloc(length*sizeof(char));
}
printf("First string,Please enter %d names (only capital letters,without spaces):", LINES);
for ( i=0 ; i<LINES ; i++)
{
gets(text1[i]);
}
printf("Second string,Please enter %d names (only capital letters,without spaces):", LINES);
for ( i=0 ; i<LINES ; i++)
{
gets(text2[i]);
}
PrintStr1(text1);
PrintStr2(text2);
SortText1(text1);
system("pause");
return ;
}
void SortText1(char **text1)
{
int i,j,k;
for (i=LINES-1 ; i>0 ; i--)
{
for ( j=0 ; j<i ; j++ )
{
if(strcmp(text1[i],text1[i+1]) > 0 )
{
char *temp=text1[i+1];
text1[i+1]=text1[i];
text1[i]=temp;
}
}
}
printf("The first string sorted:\n");
for ( k=0 ; k<LINES ; k++)
{
printf("%s ",text1[k]);
}
printf("\n");
}
void PrintStr1(char **text1)
{
int i;
printf("The first string of NAMES:\n");
for ( i=0 ; i<LINES ; i++)
{
printf("%s ",text1[i]);
}
printf("\n");
}
void PrintStr2(char **text2)
{
int i;
printf("The second string of NAMES:\n");
for ( i=0 ; i<LINES ; i++)
{
printf("%s ",text2[i]);
}
printf("\n");
}
for (i=LINES-1 ; i>0 ; i--)
...
if(strcmp(text1[i],text1[i+1]) > 0 )
在第一次迭代中,您将访问 text1[LINES-1]
和 text1[LINES]
。但是 text1[LINES]
超出范围,因此访问是非法的 - 双重非法,因为您也没有为其分配任何内存。
旁注:有趣的是,神奇的 0xfdfdfdfd
位于可访问空间之外,专门针对差一错误。
我是一名优秀的程序员,十分优秀!