【问题标题】:Dynamic Array in CC中的动态数组
【发布时间】:2017-03-11 17:55:55
【问题描述】:

我正在使用一个数组,我尝试了以下代码:

#include <stdio.h>
#include <stdlib.h>

int main()
{
char **q = (char*)malloc(1*sizeof(char*));
q[0]="So Many Books";
q[1]="So Many Books";
q[2]="So Many Books";
q[3]="So Many Books";
q[4]="So Many Books";
printf("%s\n",q[0]);
printf("%s\n",q[1]);
printf("%s\n",q[2]);
printf("%s\n",q[3]);
printf("%s\n",q[4]);
return 0;
}

为什么编译器在这里没有给我一个错误? 我只为字符串数组中的一个字符串预订了位置。

我查看了一些资源,例如:

【问题讨论】:

  • 没有语法错误,所以没有编译器错误。在c 中,内存管理取决于程序员。听起来您已经知道您的代码中充斥着 UB。
  • 你是一名 C 程序员。假设您知道自己在做什么。如果您想手持,请选择其他语言。这对初学者来说尤其困难,但心态是“程序员知道他们在做什么”,即使很明显他们不知道。
  • 当您需要char ** 时,为什么要将malloc 的结果转换为char *?你为什么要封装malloc 的结果???
  • 编译器不知道你没有分配足够的内存;这是一个直到编译时才会出现的问题。一个足够聪明的编译器可能能够解决这个问题,但通常传递给malloc 的参数不必是编译时常量,并且无法检测到这种错误所有情况。
  • 不是关于手持,但不应该停止?因为我在未预订的地方分配?

标签: c arrays pointers dynamic-memory-allocation


【解决方案1】:

为什么编译器在这里没有给我错误

仅仅是因为,这里的问题与任何语法错误无关,这是一个超出编译器错误检查管辖范围的逻辑错误。

这里的问题是,除了索引 0 之外,任何其他索引都超出了此处的访问范围。 C 标准中没有任何内容可以阻止您这样做,但是访问越界内存会调用undefined behavior,因此程序输出也是未定义的。什么事情都可能发生。只是不要那样做。

请记住,仅仅因为您可以做某事(编写代码以访问超出限制的内存)并不意味着您应该这样做。

也就是说,please see this discussion on why not to cast the return value of malloc() and family in C.

【讨论】:

    猜你喜欢
    • 2010-10-10
    • 2016-05-09
    • 1970-01-01
    • 1970-01-01
    • 2011-02-09
    • 2021-07-19
    • 2012-05-09
    相关资源
    最近更新 更多