C- segfault segv_accerr-对象的无效权限



我已经写了一个C代码,以使用交换逻辑将52张卡片的甲板拼凑起来。该代码会在0到53(52和53)之间生成一个随机数,然后用数组中的ITH索引将其交换。代码在下面。

我的问题:当我在调用swap()函数之前注释display()函数调用时,程序会抛出SEG故障。但是,当我在调用SWAP()函数之前将其输入并调用显示功能时,该程序正常工作,我会得到所需的输出。我不知道为什么会发生这种情况。

主要功能:

int main()
{
char deck[] = {'2','3','4','5','6','7','8','9','0','A','J','K','Q'};
char suit[] = {'D','H','S','C'};
char **array,**array1;
array = malloc(sizeof(char *)*52);
array1= array;
srand(time(NULL));
for(int i=0;i<=12;i++)
{
        for(int j=0;j<=3;j++)
        {
                if((*array = malloc(sizeof(char)*2))!=NULL)
                {
                        sprintf(*array,"%c%c",deck[i],suit[j]);
                        *array++;
                }
        }
}
//display(array1); // when i comment this line, the program throws segfault. when i uncomment it the program runs fine. 
swap(array1);
display(array1);
free_array(array1);
return 0;
}

这是其他函数交换和显示。

void display(char **array)
{
char **temp;
temp = array;
for(int i=0;i<=51;i++)
{
        printf("temp [%s]n",*temp);
        *temp++;
}
return;
}
void swap(char **array)
{
char **temp;
int x;
temp = array;
char *temp1;
for(int i=0;i<=51;i++)
{
        x = rand()%53;
        if(x == 53 || x == 52)
                continue;
        memcpy(temp1,temp[i],2);   // program segfaults here. 
        memcpy(temp[i],temp[x],2);
        memcpy(temp[x],temp1,2);
}
return;
}

在交换函数中 -

您正在使用temp1,而不是初始化它。

void swap(char **array)
{
  char **temp;
  int x;
  temp = array;
  char temp1[ 2 ];
  for(int i=0;i<=51;i++)
  {
        x = rand()%53;
        if(x == 53 || x == 52)
                continue;
        // need to multiply the indexes by 2
        // allowing for the suit and deck
        memcpy(temp1,temp[ i  ],2);   // program segfaults here. 
        memcpy(temp[ i  ],temp[ x  ],2);
        memcpy(temp[ x  ],temp1,2);
  }
}

以上显示了正确初始化的temp1。

我尚未检查您的其余功能,但这将停止Segfault。

您还有另一个UB

sprintf(*array,"%c%c",deck[i],suit[j]);

您需要3个字符,而不是两个字符,作为malloc:

*array = malloc(sizeof(char)*2))

相关内容

  • 没有找到相关文章

最新更新