Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言中的动态数组_C_Arrays_Pointers_Dynamic Memory Allocation - Fatal编程技术网

C语言中的动态数组

C语言中的动态数组,c,arrays,pointers,dynamic-memory-allocation,C,Arrays,Pointers,Dynamic Memory Allocation,我正在使用数组,我尝试了以下代码: #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",

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

#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;
}
#包括
#包括
int main()
{
char**q=(char*)malloc(1*sizeof(char*));
q[0]=“这么多书”;
q[1]=“这么多书”;
q[2]=“这么多书”;
q[3]=“这么多书”;
q[4]=“这么多书”;
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]);
返回0;
}
为什么编译器没有在这里给我一个错误? 我只为一组字符串中的一个字符串预订了一个位置

我查阅了一些资源,如:

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

简单地说,这里的问题与任何语法错误无关,它是一个逻辑错误,超出了编译器错误检查的权限

这里的问题是,除了索引0之外,任何其他索引在这里都是越界访问。在C标准中没有任何东西可以阻止您这样做,但是访问超出限制的内存会调用,因此程序输出也是未定义的。任何事情都有可能发生。别那么做

请记住,仅仅因为您可以做一些事情(编写代码以访问超出范围的内存),并不意味着您应该这样做


也就是说,.

没有语法错误,因此没有编译器错误。在
c
中,内存管理由程序员决定。听起来你已经知道你的代码充斥着UB。你是一个C程序员。你被认为知道你在做什么。如果你想握手,请选择不同的语言。这对初学者来说尤其困难,但他们的心态是“程序员知道他们在做什么”,即使他们显然不知道。当你需要一个
char**
时,为什么你要将
malloc
的结果转换成
char*
?你为什么要压缩malloc的结果呢?编译器不知道你没有分配足够的内存;这是一个直到编译时才会出现的问题。一个足够聪明的编译器也许能够解决这个问题,但一般来说,传递给
malloc
的参数不必是编译时常量,也不可能在所有情况下都检测到这种错误。这不是关于handd holding,,但不应该停止吗?因为我分配的是未预订的位置?