segfault SEGV_ACCERR - 对象的无效权限

时间:2017-09-05 11:22:32

标签: c unix gcc segmentation-fault

我已经编写了一个C代码,使用交换逻辑对一副52张牌进行洗牌。代码生成0到53之间的随机数(省略52和53),然后用数组中的第i个索引交换它。代码如下。

我的问题: 当我在调用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;
}

2 个答案:

答案 0 :(得分:2)

在交换功能中 -

您正在使用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已正确初始化。

我没有检查你的其余功能,但这会停止段错误。

答案 1 :(得分:1)

你还有另一个UB

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

你需要3个字符而不是2个作为malloc:

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