我有以下C个代码:

int *a;
size_t size = 2000*sizeof(int);
a = malloc(size);

这很好用.但如果我有以下几点:

char **b = malloc(2000*sizeof *b);

其中b的每个元素都有不同的长度.

怎么可能对b做与我对a做的相同的事情;也就是说,下面的代码是正确的?

char *c;
size_t size = 2000*sizeof(char *);
c = malloc(size);

推荐答案

首先,您需要分配指针数组,比如char **c = malloc( N * sizeof( char* )),然后为每一行分配一个对malloc的单独调用,可能是在循环中:


/* N is the number of rows  */
/* note: c is char** */
if (( c = malloc( N*sizeof( char* ))) == NULL )
{ /* error */ }

for ( i = 0; i < N; i++ )
{
  /* x_i here is the size of given row, no need to
   * multiply by sizeof( char ), it's always 1
   */
  if (( c[i] = malloc( x_i )) == NULL )
  { /* error */ }

  /* probably init the row here */
}

/* access matrix elements: c[i] give you a pointer
 * to the row array, c[i][j] indexes an element
 */
c[i][j] = 'a';

如果您知道元素的总数(例如N*M个),则可以在单个分配中执行此操作.

C++相关问答推荐

从 C 文件调用 C++ 标准头文件 (cstdint)

这两个具有递归函数和静态变量的 C 程序谁有不同的输出?

在 c 标头中使用 c++ 标头中的枚举类

引用如何出现在可从 C 代码调用的函数的签名中?

预处理器算法是否应该与编译所针对的体系结构相匹配?

在链表中动态存储数据的问题

我可以有条件地定义一个 openMP 并行区域吗?

如何禁用特定功能的堆栈金丝雀?

GNU inline asm:允许不同输出操作数的相同寄存器?

在 C 中浮点到二进制

指针似乎与 printf 的输出不同步

如何正确拦截 Linux 内核 5.* 中的系统调用?

使用 -O3 的冒泡排序比使用 GCC 的 -O2 慢

在 Win32 上双重转换为 unsigned int 被截断为 2,147,483,648

为什么我应该总是启用编译器警告?

C/C++ 中的 const 数组和静态 const 数组有什么区别

编译 HTK 时出现“致命错误:bits/libc-header-start.h:没有这样的文件或目录”

为什么 (A+B) 的 FFT 与 FFT(A) + FFT(B) 不同?

将输出重定向到文件时 printf() 和 system() 的结果顺序错误

为什么我在使用 rand() 时会得到这种特殊的 colored颜色 模式?