我知道如果我已经动态初始化了我的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粉丝来说很冒犯。我只是盲目地使用高级语言,以至于我忘记了多维字符串中指针的基础知识。此外,我同意其中的一个评论,即多维度只是滥用语言。我们必须将它指向数组的指针,该数组包含指向数组的指针,该数组包含指向字符串的指针。答案 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
}
如果您需要具有运行时大小而不是中间10
和100
,则无法使用此方法。您将不得不切换到动态分配指针数组,这些指针指向指向字符串的指针数组。 (好吧,我想你可以使用三维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));
}