Cor*_*ore 0 c malloc pointers segmentation-fault
我想动态分配一个字符串数组.所以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));
}
}
Run Code Online (Sandbox Code Playgroud)
循环的秒数在第二次迭代期间创建分段错误.
问题
char** arr = malloc( sizeof(char*) + n );分配(最可能)24个字节,只能存储(最有可能)6个字节char *.
您不需要尝试*(arr + sizeof(char*) * i) = base;通过基类型来偏移address().偏移量由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;
}
Run Code Online (Sandbox Code Playgroud)
前面使用数组表示法.如果您愿意,也可以使用指针表示法.更改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
根据Swordfish的建议,你应该使用const限定符arr和base:
const char **arr = malloc(sizeof(char *) * n);
const char * const base = "abcdefghijklmnopqrstuvwxyz";
Run Code Online (Sandbox Code Playgroud)
通过这种方式:
arr不能改变(没有警告/错误)指向chars.base还是指向chars 都不能改变(没有警告/错误).谢谢
让蒂姆兰德尔抓住数学错误.