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



我想动态分配一个字符串数组。因此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));
}
}

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

问题

  1. char** arr = malloc( sizeof(char*) + n );分配(最有可能(24个字节,这些字节只能存储(最可能(6个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: %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

根据剑鱼的建议,您应该在arrbase:上使用const限定符

const char **arr = malloc(sizeof(char *) * n);
const char * const base = "abcdefghijklmnopqrstuvwxyz";

这样:

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

谢谢

感谢蒂姆·兰德尔犯了一个数学错误。

相关内容

  • 没有找到相关文章

最新更新