【发布时间】:2018-08-08 06:48:18
【问题描述】:
我正在尝试使用指向指针的指针来表示字符串数组。所以我定义char** arr如下:
uint8_t lines = getLines();
char** arr = malloc (sizeof (char*) * lines);
// char** arr = malloc (sizeof (char*) * ROWS_COUNT);
在调试过程中,上面这行代码会成功执行并分配内存给arr。尝试分配足够的内存以在*(arr + 0) 中保存字符串时出现问题(以及错误),如下所示:
// #define PATH_MAX 4096
*arr = malloc (sizeof (char) * (PATH_MAX + 1));
运行时错误:
Signal: SIGSEGV (Segmentation fault)
注意:我使用了强制转换运算符(char** 的第一个赋值和char* 的第二个赋值)。它也不起作用。
注意:为了简单起见,我在这里使用了ROW_COUNTS。在原始代码中,我使用了一个lines 变量来代替ROWS_COUNT。 lines 包含一个 uint8_t 值。 (就我而言,3)
【问题讨论】:
-
这看起来不错,你能发布更多代码吗?
-
这两行不会导致段错误(除非
ROWS_COUNT或PATH_MAX发生了一些奇怪的事情)。请发帖minimal reproducible example。 -
就是这样;没有更多与该主题相关的行。为了简单起见,我在这里使用了 ROW_COUNT。实际上,我使用的是一个名为
lines的变量;其中包含3的值。PATH_MAX(我认为是系统相关的)是一个常量,它定义了 Linux 系统上的最大路径长度。 -
如果
malloc触发了段错误,您可能已经在此分配之前的“数百行”中使用其他代码破坏了堆(引用 you来自您在以下答案之一中的评论)。仅凭您在此处展示的内容,您所能期望的最好的就是 wags (wild-ass-guesses)。这个网站不是关于猜测的。这是关于答案。提供minimal reproducible example 否则这个问题可能是短暂的。 -
顺便说一句,
char (*arr)[PATH_MAX+1] = calloc(ROW_COUNT, sizeof *arr);看起来很简单,如果你真的只是想获得ROW_COUNT固定char缓冲区空间的数量。除非您需要独立的字符串指针以供以后替换和释放,否则我会选择该替代方案;单分配;单人免费。
标签: c segmentation-fault malloc