我想动态分配一个字符串数组。因此arr应该由二十个指针组成,指向每个字符串的第一个字符。
为了简单起见,每个字符串都是相同的,存储在基中。第一个for循环现在应该创建我的数组,它似乎工作得很好。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int n = 20;
char** arr = malloc( sizeof(char*) + n );
char* base = "abcdefghijklmnopqrstuvwxyz";
for(int i = 0; i < n; i++)
{
*(arr + sizeof(char*) * i) = base;
}
for(int i = 0; i < n; i++)
{
printf("%sn", *(arr + sizeof(char*) * i));
}
}
循环的秒数会在第二次迭代期间创建分段错误。
问题
-
char** arr = malloc( sizeof(char*) + n );
分配(最有可能(24个字节,这些字节只能存储(最可能(6个char *
。 -
您不需要尝试将地址(
*(arr + sizeof(char*) * i) = base;
(偏移基类型。偏移量由sizeof
(基本类型(自动调整。
必须进行以下更改:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
int n = 20;
char **arr = malloc(sizeof(char *) * n);
char *base = "abcdefghijklmnopqrstuvwxyz";
for(int i = 0; i < n; i++)
arr[i] = base;
for(int i = 0; i < n; i++)
printf("%d: %sn", i, arr[i]);
return 0;
}
前面的使用数组表示法。如果您愿意,也可以使用指针表示法。将arr[i]
更改为*(arr + i)
。
输出
$gcc-main.c-o main.exe/main.exe0:abcdefghijklmnopqrstuvxyz1:abcdefghijklmnopqrstuvxyz2:abcdefghijklmnopqrstuvxyz3:abcdefghijklmnopqrstuvxyz4:abcdefghijklmnopqrstuvxyz5:abcdefghijklmnopqrstuvxyz6:abcdefghijklmnopqrstuvxyz7:abcdefghijklmnopqrstuvxyz8:abcdefghijklmnopqrstuvxyz9:abcdefghijklmnopqrstuvxyz10:abcdefghijklmnopqrstuvxyz11:abcdefghijklmnopqrstuvxyz12:abcdefghijklmnopqrstuvxyz13:abcdefghijklmnopqrstuvxyz14:abcdefghijklmnopqrstuvxyz15:abcdefghijklmnopqrstuvxyz16:abcdefghijklmnopqrstuvxyz17:abcdefghijklmnopqrstuvxyz18:abcdefghijklmnopqrstuvxyz19:abcdefghijklmnopqrstuvxyz
根据剑鱼的建议,您应该在arr
和base
:上使用const
限定符
const char **arr = malloc(sizeof(char *) * n);
const char * const base = "abcdefghijklmnopqrstuvwxyz";
这样:
- 指向
char
s的arr
无法更改(没有警告/错误( base
的地址和指向的char
都不能更改(没有警告/错误(
谢谢
感谢蒂姆·兰德尔犯了一个数学错误。