#{...}
我的一些同事说此代码不正确,并且是非法的。但是,当我运行它时,它可以正常工作而没有任何错误。而且他不知道如何解释它为什么起作用以及为什么我不应该这样编写代码。你能帮我么。我是一个初学者,我想学习C。
答案 0 :(得分:0)
虽然不一定是非法的,但此代码无法满足您的预期。声明数组时,声明要存储的项目数,在这种情况下为num
。因此,当您声明num = 10
和arr[num]
时,您会得到一个可以容纳10个整数的数组。 C数组从0开始索引,因此索引是0-9,而不是1-10。这可能就是非法的含义。由于您正在写入arr[num]
或arr[10]
,因此您尝试使用的内存超出了为阵列分配的内存。
此外,如果我正确理解了程序的意图,则需要在数组中填写数字1-10。为此,您需要单独访问每个索引。您快到了,唯一的问题是arr[num] = i + 1;
。如前所述,它超出了数组的末尾。但是,您可能应该将i用作索引,因此arr[i]
,因为它将访问每个索引0-9。
答案 1 :(得分:0)
您正在学习C还是C ++?
您的同事意味着在您的代码中,您所做的事情与您想要的有所不同。由于某些其他因素,它正在工作。因为C / C ++标准在不断发展,所以编译器也在发展。让我告诉你。
当您是初学者时,通常建议您遵循“给定大小的类型化数组”是int arr[N]
的概念,其中N是常数。您将其分配在stack上,而不管理它的内存。
在C ++ 11中,您可以使用 constexpr (常量表达式),但是它仍然不是任意变量。
在C ++ 14中,您可以使用“简单表达式”作为大小,但是在事先获得数组概念之前,您不应该尝试过多的操作。另外,GCC编译器提供了扩展以支持可变大小的数组,这可能是“为什么代码完全起作用”的解释。
注意:可变大小的数组与动态数组不同。它们也不是C / C ++指南第一章中的静态数组。
也存在一种现代方法– std::array<int, 10>
,但再次不要从此开始。
当您需要在运行时中创建一个数组时,一切都会改变。首先,您将其分配到heap上,或者自己管理它的内存(如果不这样做,则会发生内存泄漏,采用纯C方式),或者使用特殊的C ++类,例如std::vector
。再一次,在了解了纯C数组之后,应该使用向量。
您的同事一定是这样的意思:
int* arr = new int[some_variable]; // this is dynamic array allocation
delete[] arr; // in modern C/C++ you can write "delete arr;" as well
因此,您的编译器使它可以在这种情况下工作,但是您绝对不应该依赖您尝试过的方法。根本不是数组分配。
TL; DR:
arr[i] = i + 1
,否则,您一直都在分配给同一数组项答案 2 :(得分:0)
如果要动态分配长度为n int
s的数组,则需要使用malloc或calloc。 Calloc是数组分配的首选,因为它具有内置的乘法溢出检查功能。
int num = 10;
int *arr = calloc(num, sizeof(*arr));
//Do whatever you need to do with arr
free(arr);
arr = NULL;
每当您使用malloc
或calloc
分配内存时,请始终记住在之后free
将其设置为空,然后将指针设置为NULL,以防止将来发生任何意外的引用,以及防止双重释放。