我想动态分配一个字符串数组。 所以 arr 应该包含指向每个字符串第一个字符的二十个指针。
为简单起见,每个字符串都是相同的,存储在base 中。 第一个 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("%s\n", *(arr + sizeof(char*) * i));
}
}
for 循环的秒数在第二次迭代期间创建了一个segmentation-fault。
最佳答案
问题
char** arr = malloc( sizeof(char*) + n );
分配(很可能)24 个字节,只能存储(很可能)六个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: %s\n", i, arr[i]);
return 0;
}
前面使用数组表示法。如果您愿意,也可以使用指针表示法。将 arr[i]
更改为 *(arr + i)
。
输出
$ gcc main.c -o main.exe; ./main.exe 0: abcdefghijklmnopqrstuvwxyz 1: abcdefghijklmnopqrstuvwxyz 2: abcdefghijklmnopqrstuvwxyz 3: abcdefghijklmnopqrstuvwxyz 4: abcdefghijklmnopqrstuvwxyz 5: abcdefghijklmnopqrstuvwxyz 6: abcdefghijklmnopqrstuvwxyz 7: abcdefghijklmnopqrstuvwxyz 8: abcdefghijklmnopqrstuvwxyz 9: abcdefghijklmnopqrstuvwxyz 10: abcdefghijklmnopqrstuvwxyz 11: abcdefghijklmnopqrstuvwxyz 12: abcdefghijklmnopqrstuvwxyz 13: abcdefghijklmnopqrstuvwxyz 14: abcdefghijklmnopqrstuvwxyz 15: abcdefghijklmnopqrstuvwxyz 16: abcdefghijklmnopqrstuvwxyz 17: abcdefghijklmnopqrstuvwxyz 18: abcdefghijklmnopqrstuvwxyz 19: abcdefghijklmnopqrstuvwxyz
As recommended by Swordfish you should use the const
qualifier on arr
and base
:
const char **arr = malloc(sizeof(char *) * n);
const char * const base = "abcdefghijklmnopqrstuvwxyz";
这样:
arr
无法更改(没有警告/错误)指向char
。base
的地址和指向char
的地址都不能更改(没有警告/错误)。
谢谢
收件人Tim Randall用于捕获数学错误。
关于c - 在没有新 malloc 的情况下从现有字符串动态构造一个数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53419444/