Невозможно случайно перемешать карты

Я делаю проект, который случайным образом перемешивает 10 карт (12), но это не сработало с моим кодом.

#include <stdio.h>
#include <time.h>
#include <stdlib.h>

void show(int[],int);

void shuffle(int[],int,int);

int main (void)
{
    int karten[]={1,2,3,4,5,6,7,8,9,10};
    int n = sizeof(karten)/sizeof(int);
    //printf("%d",n);
    int s=12;

    srand(time(NULL));
    printf("Karten vor dem Mischen: \n");
    show(karten,n);
    shuffle(karten,n,s);
    printf("Karten nach dem Mischen:\n");
    show(karten,n);
    return 0;
}
void show(int karten[],int n)
{
    for(int i=0;i<n;i++)
    {
        printf("%d,",karten[i]);
    }
    printf("\n");
}
void shuffle(int karten[],int n,int s)
{
    int i=0;
    int d=0;
    int v[]={(int)malloc(sizeof(karten))};
    for(int z=0;z<=s;z++)
    {
        i=rand()%10;
        d=rand()%10;
        //printf("%d-->%d\n",i,d);
        v[i]=karten[i];
        v[d]=karten[d];
        karten[d]=v[i];
        karten[i]=v[d];

    }
    printf("Es wurden %d Vertauschungen gemacht\n",s);
    free(v);
}

Ошибка

(((process returned 255))) 

и программа дала сбой.


person heroo    schedule 20.01.2016    source источник


Ответы (2)


sizeof(karten) не дает вам длину массива, см. разъяснение размера массива. Просто перепишите код следующим образом (другой массив не нужен):

void shuffle(int karten[],int n,int s)
{
    int i=0, vi;
    int d=0, vd;
    for(int z=0;z<=s;z++)
    {
        i=rand()%10;
        d=rand()%10;
        vi=karten[i];
        vd=karten[d];
        karten[d]=vi;
        karten[i]=vd;   
    }
    printf("Es wurden %d Vertauschungen gemacht\n",s);
}
person Jean-Baptiste Yunès    schedule 20.01.2016
comment
Я думаю, вы должны объяснить, почему. В конце концов, sizeof(karten) в main действителен и, вероятно, сбивает с толку. - person user694733; 20.01.2016

void shuffle(int karten[],int n,int s) эквивалентен
void shuffle(int *karten,int n,int s)
поэтому int v[]={(int)malloc(sizeof(karten))}; выделяет размер karten
, который является указателем на int, то есть 4 байта (в большинстве систем).
Из-за этого вы пытаетесь получить доступ нераспределенная память.

person Viktor Simkó    schedule 20.01.2016