c - 在没有新 malloc 的情况下从现有字符串动态构造一个数组

标签 c pointers segmentation-fault malloc

我想动态分配一个字符串数组。 所以 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

最佳答案

问题

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

  2. 您不需要尝试根据基类型偏移地址 (*(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";

这样:

  1. arr 无法更改(没有警告/错误)指向 char
  2. base 的地址和指向 char 的地址都不能更改(没有警告/错误)。

谢谢

收件人Tim Randall用于捕获数学错误。

关于c - 在没有新 malloc 的情况下从现有字符串动态构造一个数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53419444/

相关文章:

c++ - 是什么导致了段错误?

c - 逻辑或 C 编程语言

c - make后出现意外的rm

c++ - 客户端代码 : Memory leak for particular functions 中的 Valgrind Hook

c++ - 错误] ISO C++ 禁止指针和整数之间的比较 [-fpermissive]

c++ - 如何将 vector 的 vector 传递给期望指向指针的(原始)指针的函数

c - C 中的实现堆栈

C 2D 字符串数组在其声明的函数之外导致段错误

char *str 并为 str 分配内存,仍然得到 SEGFAULT

C程序字符串困惑