如何在C中复制多维字符串

时间:2014-04-29 12:28:02

标签: c arrays string

我知道如果我已经动态初始化了我的2D字符串数组,我必须多次使用memcpy但是我已经使用标准的C编译时语法来初始化函数堆栈中的2D字符串数组。但是,由于我不能简单地将指针传递给临时堆栈内存区域,因此我将不得不使用memcpy将整个内存复制到动态分配的空间中。但是,当我尝试这样做时,我会遇到分段错误。

#include <string.h>

char ***simar (int *b, int *c) {
    //b=c;
    char a[10][10][100] = {{"hello","hey","bro"},{"huh", "hey","ouch"}};
    char ***d = malloc(sizeof(a));
    memcpy (d ,a , 100*10*10 * sizeof(char));
    //printf("\n%s" , *(*(d+0) + 0));
    return (char ***)d;
}

int main() {

int a[] = {1,2,3};
int b[] = {4,5,6};
char ***d = simar(a,b);

    printf("\n%s" , *(*(d+0) + 0));
    printf("\n%s" , *(*(d+0) + 1));
    printf("\n%s" , *(*(d+0) + 2));
}

其次,我正在以正确的方式做到这一点。在C函数中传递多维数组字符串数组的正确方法是什么?

编辑:我知道我的语法对C粉丝来说很冒犯。我只是盲目地使用高级语言,以至于我忘记了多维字符串中指针的基础知识。此外,我同意其中的一个评论,即多维度只是滥用语言。我们必须将它指向数组的指针,该数组包含指向数组的指针,该数组包含指向字符串的指针。

3 个答案:

答案 0 :(得分:1)

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

void  *simar(void) {
    char a[10][10][100] = {{"hello","hey","bro"},{"huh", "hey","ouch"}};
    void *d = malloc(sizeof(a));
    memcpy (d, a, sizeof(a));
    return d;
}

int main() {
    char (*d)[10][10][100] = simar();

    printf("\n%s" , (*d)[0][0]);//hello
    printf("\n%s" , (*d)[0][1]);//hey
    printf("\n%s" , (*d)[0][2]);//bro
    printf("\n%s" , (*d)[1][0]);//huh
    free(d);
    return 0;
}

答案 1 :(得分:0)

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

typedef char ARR[10][100];

ARR *simar (void)
{
    char a[10][10][100] = {{"hello","hey","bro"},{"huh", "hey","ouch"}};
    ARR *d = malloc(sizeof a);
    memcpy (d , a , sizeof a);
    return d;
}

int main()
{
ARR *d = simar();

    printf("%s\n" , d[0][0] );
    printf("%s\n" , d[0][1] );
    printf("%s\n" , d[0][2] );

    free(d);    // thanks BLUEPIXY
}

如果您需要具有运行时大小而不是中间10100,则无法使用此方法。您将不得不切换到动态分配指针数组,这些指针指向指向字符串的指针数组。 (好吧,我想你可以使用三维VLA)。

答案 2 :(得分:0)

这样的事情就是我想要的。基本上如上面的评论中所提到的,我们必须使用malloc指针数组,它将取消引用stings。关于使用连续空间,我们可以重新声明数组,以便编译器知道当你可以+ +等时跳过多少。

char ***simar (int *b, int *c) {
    b=c;
    //char a[][10][100] = {{"hello","hey","bro"},{"huh", "hey","ouch"}};

    char ***a;
    a = malloc (sizeof(char*) *2);

    *(a+0) = malloc (sizeof(char*)*3);
    *(*(a+0)+0) = malloc (sizeof(char)*10);
    *(*(a+0)+1) = malloc (sizeof(char)*10);
    *(*(a+0)+2) = malloc (sizeof(char)*10);

    *(a+1) = malloc (sizeof(char*)*3);
    *(*(a+1)+0) = malloc (sizeof(char)*10);
    *(*(a+1)+1) = malloc (sizeof(char)*10);
    *(*(a+1)+2) = malloc (sizeof(char)*10);



    strcpy(**a, "hello");
    strcpy(*((*a)+1), "hey");
    strcpy(*((*a)+2), "bro");

    strcpy(**(a+1), "huh");
    strcpy(*(*(a+1)+1), "hey");
    strcpy(*(*(a+1)+2), "ouch");




    //printf("\n%d\n" , sizeof(a));
    //char ***d = malloc(sizeof(a)*2);
    //memcpy (d ,a , sizeof(a));
    //printf("\n%d\n" , sizeof(a));

    //printf("\n%s" , *(*(d+0) + 0));
    return a;
}

int main() {
int a[] = {1,2,3};
int b[] = {4,5,6};

char ***d = simar(a,b);

printf("\n%s" , *(*(d+0) + 0));
printf("\n%s" , *(*(d+0) + 1));
printf("\n%s" , *(*(d+0) + 2));

printf("\n%s" , *(*(d+1) + 0));
printf("\n%s" , *(*(d+1) + 1));
printf("\n%s" , *(*(d+1) + 2));
}