我想要** char finalString
,即*char
的列表。在我的函数运行后,每个*char
指针都包含一个char
"A"、"B"、"C",然后可以将其传递给需要char**
类型参数的函数。每个字符串必须是独立的,但在同一数组中,因此**
.
创建这个**char
,我写了以下内容:
char ** finalString;
finalString = malloc(sizeof(char*)*3);
int stringAddressCounter = 0;
然后,为了添加字符,我尝试了以下方法:
char ** nextStringAddress = finalString + stringAddressCounter;
** nextStringAddress = 'A';
stringAddressCounter++;
但是,我在此块的第二行上遇到了分段错误。
我做错了什么?
您为char*
分配了内存,但没有为要存储的char
分配内存。
这是指针的经验法则,每个 * 都应该有一个 malloc,这意味着对于char **
你应该有一个用于char *
的 malloc 和另一个用于char
。
有时玩指针也有点误导,为了可读性,应该使用括号来代替
char ** nextStringAddress = finalString + stringAddressCounter;
nextStringAddress[stringAddressCounter] = malloc(sizeof **nextStringAddress * 3)
nextStringAddress[stringAddressCounter][0] = 'A';
nextStringAddress[stringAddressCounter][1] = 'a';
nextStringAddress[stringAddressCounter][2] = ' ';
stringAddressCounter++;
使用单个malloc也可以这样做
char ** nextStringAddress = finalString + stringAddressCounter;
nextStringAddress[stringAddressCounter] = "Aa";
stringAddressCounter++;
请注意此处的双引号Aa
和缺少的第二个括号。 应该注意的是,通过这样做,您实际上是在分配一个只读的内存区域,并且通过尝试在此内存上分配,将导致分段错误。