将内存分配给指针变量[C]时出现分段错误

时间:2018-08-08 06:48:18

标签: c segmentation-fault malloc

我试图通过使用指向指针的指针来表示字符串数组。因此,我将char** arr定义如下:

uint8_t lines = getLines();
char** arr = malloc (sizeof (char*) * lines);
// char** arr = malloc (sizeof (char*) * ROWS_COUNT);

在调试过程中,以上行将成功执行并将内存分配给arr。尝试分配足够的内存以在*(arr + 0)中容纳字符串时,就会出现问题(因此是错误),如下所示:

// #define PATH_MAX 4096
*arr = malloc (sizeof (char) * (PATH_MAX + 1));

运行时错误:

Signal: SIGSEGV (Segmentation fault)

注意:我使用了强制转换运算符(第一个赋值由char**和第二个赋值由char*)。它也不起作用。

注意:为简单起见,我在这里使用了ROW_COUNTS。在原始代码中,有一个lines变量供我使用,而不是ROWS_COUNTlines包含一个uint8_t值。 (对于我来说,3

2 个答案:

答案 0 :(得分:1)

您可以在单个 malloc()中动态分配内存,请尝试以下代码:-

char (*arr)[ROWS_COUNT][PATH_MAX + 1] = malloc (sizeof(*arr));

,您可以使用:-

访问字符串
(*arr)[ index ] 

字符使用:-

(*arr)[ row ] [ column ]

示例:-

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define PATH_MAX 4096
#define  ROWS_COUNT 500
int main()
{
    char (*arr)[ROWS_COUNT][PATH_MAX + 1] = malloc (sizeof(*arr));
    strcpy((*arr)[400],"Hello World");
    printf("\n String    : %s",(*arr)[400]);
    printf("\n Character : %c",(*arr)[400][2]);
}

输出:-

 String    : Hello World
 Character : l

答案 1 :(得分:-1)

// #define PATH_MAX 4096
*arr = malloc (sizeof (char) * (PATH_MAX + 1));

我认为该行必须在ROWS_COUNT次循环内。这样就可以为要存储的所有行分配内存。

在Mac上使用Xcode(版本9.3(9E145))进行了测试,可以正常工作:

char** arr = (char**) malloc (sizeof (char*) * 1000);
int i = -1;
while(++i < 1000)
{
    *(arr + i) = (char*) malloc (sizeof (char) * (PATH_MAX + 1));
}