我试图通过使用指向指针的指针来表示字符串数组。因此,我将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_COUNT
。 lines
包含一个uint8_t
值。 (对于我来说,3
)
答案 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));
}