C - 数组内容交换

时间:2017-07-02 13:58:35

标签: c arrays string matrix

我实际上正在尝试使用二维数组的字符串(事实上它可能是三维的)来交换数组的两个“单元”。

之前,我使用过memcpy,但是当来到长字符串时,执行时间很长,所以我认为可以简单地交换数组的指针,但我不知道该怎么做:(

这是我的代码:

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

void fonction(unsigned char*** tab);

int main()
{
    unsigned char*** tab;
    tab = malloc(sizeof(unsigned char**) * 3);
    if (tab == NULL)
        exit(0);

    for (int line = 0; line < 3; line++)
        tab[line] = malloc(sizeof(unsigned char*) * 3);

    for (int line = 0; line < 3; line++)
        for (int column = 0; column < 3; column++)
            tab[line][column] = malloc(sizeof(unsigned char) * 5);


    for (int line = 0; line < 3; line++)
        for (int column = 0; column < 3; column++)
            for (int cell = 0;cell < 5;cell++)
                tab[line][column][cell] = line * 3 * 5 + column * 5 + cell;



    for (int i = 0;i < 32;i++)
        fonction(tab);

    for (int line = 0; line < 3; line++)
        for (int column = 0; column < 3; column++)
            free(tab[line][column]);

    for (int line = 0; line < 3; line++)
        free(tab[line]);

    free(tab);

    return 0;
}

void fonction(unsigned char*** tab)
{
    unsigned char temp[5] = { 0, 0, 0, 0, 0 };

    int alea = 0;
    int alea2 = 0;
    int alea3 = 0;
    int alea4 = 0;

    srand(58);

    for (int line = 0; line < 3; line++)
    {
        for (int column = 0; column < 3; column++)
        {
            alea = rand() % 3;
            alea2 = rand() % 3;
            alea3 = rand() % 3;
            alea4 = rand() % 3;

            *temp = tab[alea][alea2];
            tab[alea][alea2] = tab[alea3][alea4];
            tab[alea3][alea4] = *temp;
        }
    }
}

在释放标签时出现错误,这是可以预料的,因为 fonction 做了任何旧事:)

提前致谢!

2 个答案:

答案 0 :(得分:0)

我无法真正了解您尝试对代码执行的操作,但这是一个移动字符串指针的工作示例:

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

#define STR_NUM 3

int main(void)
{ 
    char * str1[STR_NUM] = {"one", "two", "three"};
    char * str2[STR_NUM];

    int i;
    for (i = 0; i < STR_NUM; ++i)
        puts(str1[i]);

    for (i = 0; i < STR_NUM; ++i)
        str2[i] = str1[i];

    for (i = 0; i < STR_NUM; ++i)
        puts(str2[i]);

    return 0;
}

答案 1 :(得分:0)

我不确定你为什么要使用

   unsigned char temp[5] = { 0, 0, 0, 0, 0 };

只需使用

    char* temp;

并且交换为

        temp = tab[alea][alea2];
        tab[alea][alea2] = tab[alea3][alea4];
        tab[alea3][alea4] = temp;