在没有new malloc的情况下,用现有字符串动态构造一个数组

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)

循环的秒数在第二次迭代期间创建分段错误.

Fid*_*its 5

问题

  1. char** arr = malloc( sizeof(char*) + n );分配(最可能)24个字节,只能存储(最有可能)6个字节char *.

  2. 您不需要尝试*(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限定符arrbase:

const char **arr = malloc(sizeof(char *) * n);
const char * const base = "abcdefghijklmnopqrstuvwxyz";
Run Code Online (Sandbox Code Playgroud)

通过这种方式:

  1. arr不能改变(没有警告/错误)指向chars.
  2. 无论是地址base还是指向chars 都不能改变(没有警告/错误).

谢谢

蒂姆兰德尔抓住数学错误.