我已经写了一个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))