在C语言中转置矩阵

在C语言中转置矩阵,c,arrays,pointers,math,matrix,C,Arrays,Pointers,Math,Matrix,我需要写一个程序来转换C中的矩阵。需要转换的矩阵是一个一维数组,数组a: void fill_array_A(char *arrayA, int ssize) { int i; for(i=0; i<ssize; i++) { printf("Letter %d:\n> ", (i+1)); scanf(" %c", &arrayA[i]); } } void show_array_A(char *arrayA

我需要写一个程序来转换C中的矩阵。需要转换的矩阵是一个一维数组,数组a:

void fill_array_A(char *arrayA, int ssize)
{
    int i;
    for(i=0; i<ssize; i++)
    {
        printf("Letter %d:\n> ", (i+1));
        scanf(" %c", &arrayA[i]);
    }
}

void show_array_A(char *arrayA, int ssize)
{
    int n = sqrt(ssize);
    int i,j=0;

    for(i=0; i<ssize; i++)
    {
        printf("valueA[%d] = %c ", i, arrayA[i]);

        j ++;

        if(j == n)
        {
            printf("\n");
            j = 0;
        }
    }
}

valueA[0] = a valueA[1] = a valueA[2] = a 
valueA[3] = b valueA[4] = b valueA[5] = b 
valueA[6] = c valueA[7] = c valueA[8] = c 
我的代码告诉我:

valueB[0] = a valueB[1] = b valueB[2] = b 
valueB[3] = a valueB[4] = b valueB[5] = b 
valueB[6] = a valueB[7] = b valueB[8] = b 
问题在哪里?以下是全部代码:

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

char* create_array_A(int ssize)
{
    char *arrayA = malloc(sizeof(char) * ssize);
    return arrayA;
}

void fill_array_A(char *arrayA, int ssize)
{
    int i;
    for(i=0; i<ssize; i++)
    {
        printf("Letter %d:\n> ", (i+1));
        scanf(" %c", &arrayA[i]);
    }
}

void show_array_A(char *arrayA, int ssize)
{
    int n = sqrt(ssize);
    int i,j=0;

    for(i=0; i<ssize; i++)
    {
        printf("valueA[%d] = %c ", i, arrayA[i]);

        j ++;

        if(j == n)
        {
            printf("\n");
            j = 0;
        }
    }
}

char** create_array_B(char *arrayA, int ssize)
{
    int n = sqrt(ssize);
    int i,j;

    char **arrayB = malloc(sizeof(char*) * n);

    for(i=0; i<n; i++)
    {
        for(j=0; j<n; j++)
        {
            arrayB[j] = &arrayA[i];
        }
    }
    return arrayB;
}

void show_array_B(char** arrayB, int n, int m)
{
    int i,j,k=0;

    for(i=0; i<n; i++)
    {
        for(j=0; j<m; j++)
        {
            printf("valueB[%d] = %c ", k, arrayB[i][j]);
            k ++;
        }
        printf("\n");
    }
}

int main(int argc, char **argv)
{
    int n = 9;

    char *arrayA = create_array_A(n);
    fill_array_A(arrayA, n);
    show_array_A(arrayA, n);

    printf("\n");

    char **arrayB = create_array_B(arrayA, n);
    show_array_B(arrayB, sqrt(n), sqrt(n));

    return 0;
}
#包括
#包括
#包括
字符*创建数组(int-ssize)
{
char*arrayA=malloc(sizeof(char)*ssize);
返回阿拉亚;
}
空填充数组(字符*数组,整数大小)
{
int i;

对于(i=0;i,代码中有几个错误,最明显的是创建数组B。请尝试以下方法:

char** create_array_B(char *arrayA, int ssize)
{
    int n = sqrt(ssize);
    int i,j;

    char **arrayB = malloc(sizeof(char*) * ssize);
    //                                      ^^^
    if (arrayB == NULL)
        // handle error
    for(i = 0; i < n; i++)
    {
        for(j = 0; j < n; j++)
            arrayB[i * n + j] = &arrayA[j * n + i];
            //     ^^^^^^^^^            ^^^^^^^^^^
    }
    return arrayB;
}

代码中有几个错误,最明显的错误是创建数组B。请尝试以下方法:

char** create_array_B(char *arrayA, int ssize)
{
    int n = sqrt(ssize);
    int i,j;

    char **arrayB = malloc(sizeof(char*) * ssize);
    //                                      ^^^
    if (arrayB == NULL)
        // handle error
    for(i = 0; i < n; i++)
    {
        for(j = 0; j < n; j++)
            arrayB[i * n + j] = &arrayA[j * n + i];
            //     ^^^^^^^^^            ^^^^^^^^^^
    }
    return arrayB;
}

矩阵通常是2D数组。“向量”的换位是非常无用的,只是根据它们的用法对它们进行不同的解释。而且
char**
绝对不是2D数组!指针不是数组。矩阵通常是2D数组。“向量”的换位是很没用的,只是根据它们的用法进行不同的解释。而且
char**
绝对不是2D数组!指针不是数组。好的,非常感谢。好的,非常感谢
p@:/matrix_transp$ valgrind --leak-check=yes --leak-check=full --show-leak-kinds=all ./executable 
==30322== Memcheck, a memory error detector
==30322== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
==30322== Using Valgrind-3.10.0 and LibVEX; rerun with -h for copyright info
==30322== Command: ./executable
==30322== 
valueA[0] = 0 valueA[1] = 1 valueA[2] = 2 
valueA[3] = 3 valueA[4] = 4 valueA[5] = 5 
valueA[6] = 6 valueA[7] = 7 valueA[8] = 8 

valueB[0] = 0 valueB[1] = 3 valueB[2] = 6 
valueB[3] = 1 valueB[4] = 4 valueB[5] = 7 
valueB[6] = 2 valueB[7] = 5 valueB[8] = 8 
==30322== 
==30322== HEAP SUMMARY:
==30322==     in use at exit: 0 bytes in 0 blocks
==30322==   total heap usage: 2 allocs, 2 frees, 81 bytes allocated
==30322== 
==30322== All heap blocks were freed -- no leaks are possible
==30322== 
==30322== For counts of detected and suppressed errors, rerun with: -v
==30322== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)