我试图将2D const char数组中的3个字符串复制到char的双指针中。
char **E = malloc(sizeof(char));
const char *e[3] = {"aa", "bb", "cc"};
for (int k=0; k<3; k++)
{
E[k] = malloc(sizeof(char));
strcpy(E[k], e[k]); //crash occurs here
}
答案 0 :(得分:1)
char **E = malloc(sizeof(char));
指向char
指针的指针必须为char
指针保留空间,而不是普通char
指针。
似乎你想要一个常量指针数组的可修改副本,然后改为:
char **E = malloc(sizeof(char *) * 3);
const char *e[3] = {"aa", "bb", "cc"};
for (int k=0; k<3; k++)
{
E[k] = malloc(strlen(e[k]) + 1);
strcpy(E[k], e[k]);
}
答案 1 :(得分:1)
char **E = malloc(sizeof(char));
应该是
char **E = malloc(3 * sizeof(char*));
前者仅分配一个字节,但你需要为char
(char*
)分配3个指针的内存,这就是后者所做的。
类似地,
E[k] = malloc(sizeof(char));
应该是
E[k] = malloc(strlen(e[k]) + 1);
因为您需要内存来存储'\0'
中每个字符串(NUL终结符E[K]
的+1)而不仅仅是1个字节。
答案 2 :(得分:1)
此解决方案是您希望E指向相同的常量字符串 作为变量e。
试试这段代码:
#include <stdio.h>
#include <stdlib.h>
int
main(void)
{
char **E = malloc(3*sizeof(char *));
const char *e[3] = {"aa", "bb", "cc"};
int k;
for (k=0; k<3; k++)
{
E[k] = e[k];
}
for( k=0; k<3; k++ )
{
printf( "%s\n", E[k]);
}
return 0;
}
以下是解释。
变量'e'是一个由3个指向常数字符的数组。
让我们说“aa”存储在100的内存地址中。
让我们说“bb”存储在200的内存地址中。
假设“cc”存储在300的内存地址中。
'e'变量如下所示:
e [0] e [1] e [2]
| ------ | ------- | ------ |
| 100 | 200 | 300 |
| ------ | ------- | ------ |
E [k] = e [k];赋值会导致E看起来像
E [0] E [1] E [2]
| ------ | ------- | ------ |
| 100 | 200 | 300 |
| ------ | ------- | ------ |
答案 3 :(得分:0)
E是char**
,表示它包含char*
,其中包含char
。
这意味着必须为E分配足够的空间来容纳char*
,这意味着malloc:
sizeof(char*) * thenumberofchar*youwantittocontains
对于包含在E中的每个char*
(E[k]
),它们必须被分配
sizeof(char) * thenumberofcharyouwanittocontains + 1 (for the '/0' character that tell that the char* has ended)
因为如果您没有分配足够的内存空间,您将无法通过E[k]
甚至{{1}尝试访问的所有内存位置进行写入},因为它没有为你的程序分配,导致分段错误。