我有一个以字符串数组为参数的函数,如下所示:

void print_string_array(int *dims, const char **str) {
  for (int i=0; i<dims[0]; i++) {
    printf("STRING %d: %s\n", i, str[i]);
  }
}

我想知道为什么使用它(显示没有free个呼叫):

int main() {
     char *test_str_1[3];
     for (int i=0; i<3; i++) {
      test_str_1[i] = malloc(sizeof(char *) * 4096);
      test_str_1[i][0] = '\0';
     }
     strncat(test_str_1[0], "This is first line", 4095);
     strncat(test_str_1[1], "This is second line", 4095);
     strncat(test_str_1[2], "This is third line", 4095);

     int dims[1] = {3};
     print_string_array(dims, (const char **) test_str_1);
     return 0;
}

工作正常,但以下segfaults在print_string_array中的printf行:

int main () {
     char test_str_1[3][4096];
     for (int i=0; i<3; i++) {
      test_str_1[i][0] = '\0';
     }
     strncat(test_str_1[0], "This is first line", 4095);
     strncat(test_str_1[1], "This is second line", 4095);
     strncat(test_str_1[2], "This is third line", 4095);

     int dims[1] = {3};
     print_string_array(dims, (const char **) test_str_1);
     return 0;
}

我原以为这两者是对等的,但显然事实并非如此……

非常感谢你的帮助!

推荐答案

因为它们是完全不同的.

  1. test_str_1[3][4096]char的数组
  2. char *test_str_1[3]是指向char的指针数组
void print_string_array(int *dims, const char **str)

需要指向指向字符的指针的指针,它将使用从点2开始的array.因为它将衰减为指向指针的指针.

要使用char数组,需要将函数声明为:

void print_string_array(int *dims, const char (*str)[4096])

从点1开始的数组将衰减为指向4096 char元素数组的指针.

C++相关问答推荐

Apple Libm的罪恶功能

了解一些CLIPS原语数据类型

为什么这个C程序代码会产生以下结果?

如何判断宏参数是否为C语言中的整型文字

如何创建由符号组成的垂直结果图形?

两个连续的语句是否按顺序排列?

如何在C中从函数返回指向数组的指针?

无效指针值在函数调用之间莫名其妙地改变

将fget()与strcMP()一起使用不是正确的比较

为什么我一直收到分段错误?

如何知道我是否从非阻塞套接字读取所有内容

OpenSSL:如何将吊销列表与SSL_CTX_LOAD_VERIFY_LOCATIONS一起使用?

处理EPOLL_WAIT中的接收数据和连接关闭信号

在C语言中,指针指向一个数组

使用ld将目标文件链接到C标准库

将 struct 数组写入二进制文件时发生Valgrind错误

表达式x&;&;(~x)应该返回1还是0?它依赖于编译器吗?

无算术运算符和循环的二进制乘法

共享内存未授予父进程权限

定义 int a = 0, b = a++, c = a++;在 C 中定义了行为吗?