访问冲突读取位置0xfdfdfdfd。 IN C.

时间:2013-09-20 09:49:48

标签: c

我想得到你的帮助。我正在调试我的代码,我发现编译器在这行中踢了我

 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");
}

1 个答案:

答案 0 :(得分:4)

for (i=LINES-1 ; i>0 ; i--)
...
    if(strcmp(text1[i],text1[i+1]) > 0 )

在第一次迭代中,您将访问text1[LINES-1]text1[LINES]。但是text1[LINES]超出界限,因此非法访问 - 双重违法,因为你没有为它分配任何内存。


旁注:魔术0xfdfdfdfd位于可访问空间之外的方式非常有趣,特别针对逐个错误。