C:带有2D数组的SEGFAULT

时间:2017-04-09 01:04:09

标签: c arrays pointers memory-management

我试图将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
    }

4 个答案:

答案 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*));

前者仅分配一个字节,但你需要为charchar*)分配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}尝试访问的所有内存位置进行写入},因为它没有为你的程序分配,导致分段错误。