数组问题C的动态分配
Dynamic allocation of array issue C
明确地说,我的代码运行完美。我担心的问题是我不确定我的数组分配类型。
我的任务很简单:我需要在一个动态分配的数组中做一些操作。
但是,数组中已经给出了值。因此,我需要在其中添加这些值。
保持我的向量动态分配并避免以下情况:
float *p;
p = malloc(9 * sizeof(float));
* p=2;
* (p+1)=60;
* (p+2)=-23;
.
.
.
* (p+8)=9;
我试过这样做:
float *p;
p = malloc(9 * sizeof(float));
memcpy (p, (float[]) {2 ,60 ,-23, 55, 7, 9, -2.55, -66.9, 9}, 9 * sizeof(float));
现在我不确定,因为 memcpy 将静态分配的数组复制到我的 p
中。那么我的问题是:我的数组仍然保持动态分配?
编辑:我的问题涉及第二个代码。
首先,你没有(y)数组,你只有一个指向特定大小内存的指针。
其次,正如你提到的,(强调我的)
memcpy copies a static allocated array into my p
所以,是的,指针仍然具有(或指向)动态分配的内存。
正如我们从 C11
章节 §7.24.2.1 中看到的那样
The memcpy
function copies n
characters from the object pointed to by s2
into the
object pointed to by s1
. [...]
所以,我们可以看到,对象本身并没有改变/替换,只是复制了内容。
如果你的初始化值是常量,你可以使用复合文字。但是,代码很容易出错。如果您忘记了文字中的一个元素,您将越界访问数组。这会调用 未定义的行为。
改变三件事:
// use a macro for the length. In general don't use magic numbers!
#define ARRAY_LEN 9
// change the compound literal to:
... (static const float [ARRAY_LEN]){ ... }
这样可以避免每次执行函数时都复制文字。它还使文字不可变,因此编译器可以检查您是否尝试为其赋值。
注意:mempcy
不是 "copy a static(ally) allocated array ..."。这既不是对数组的要求,也不是您使用静态对象的复合文字,而是自动的。
警告: 始终检查函数的结果,如果函数执行的任何操作用于进一步处理,则可能会遇到错误。 malloc
可以 return 一个 空指针 错误。妥善处理这种情况!
my array still remains dynamically allocated?
float *p;
p = malloc(9 * sizeof(float));
memcpy ( p, (float[]){2,60,-23,55,7,9,-2.55,-66.9,9}, 9 * sizeof(float));
是的。指针p
的值保持不变。它仍然指向动态分配的内存。
p[0]
,第一个元素现在的值为 2.0f
,
p[1]
,下一个元素现在的值为 60.0f
,等等
一些编码建议:
int main(void) {
#define COUNT 9
float *p = malloc(sizeof *p * COUNT);
if (p) {
memcpy(p, (float[COUNT] ) { 2, 60, -23, 55, 7, 9, -2.55f, -66.9f, 9 },
sizeof *p * COUNT);
//...
}
free(p);
return 0;
}
明确地说,我的代码运行完美。我担心的问题是我不确定我的数组分配类型。
我的任务很简单:我需要在一个动态分配的数组中做一些操作。
但是,数组中已经给出了值。因此,我需要在其中添加这些值。
保持我的向量动态分配并避免以下情况:
float *p;
p = malloc(9 * sizeof(float));
* p=2;
* (p+1)=60;
* (p+2)=-23;
.
.
.
* (p+8)=9;
我试过这样做:
float *p;
p = malloc(9 * sizeof(float));
memcpy (p, (float[]) {2 ,60 ,-23, 55, 7, 9, -2.55, -66.9, 9}, 9 * sizeof(float));
现在我不确定,因为 memcpy 将静态分配的数组复制到我的 p
中。那么我的问题是:我的数组仍然保持动态分配?
编辑:我的问题涉及第二个代码。
首先,你没有(y)数组,你只有一个指向特定大小内存的指针。
其次,正如你提到的,(强调我的)
memcpy copies a static allocated array into my
p
所以,是的,指针仍然具有(或指向)动态分配的内存。
正如我们从 C11
章节 §7.24.2.1 中看到的那样
The
memcpy
function copiesn
characters from the object pointed to bys2
into the object pointed to bys1
. [...]
所以,我们可以看到,对象本身并没有改变/替换,只是复制了内容。
如果你的初始化值是常量,你可以使用复合文字。但是,代码很容易出错。如果您忘记了文字中的一个元素,您将越界访问数组。这会调用 未定义的行为。
改变三件事:
// use a macro for the length. In general don't use magic numbers!
#define ARRAY_LEN 9
// change the compound literal to:
... (static const float [ARRAY_LEN]){ ... }
这样可以避免每次执行函数时都复制文字。它还使文字不可变,因此编译器可以检查您是否尝试为其赋值。
注意:mempcy
不是 "copy a static(ally) allocated array ..."。这既不是对数组的要求,也不是您使用静态对象的复合文字,而是自动的。
警告: 始终检查函数的结果,如果函数执行的任何操作用于进一步处理,则可能会遇到错误。 malloc
可以 return 一个 空指针 错误。妥善处理这种情况!
my array still remains dynamically allocated?
float *p;
p = malloc(9 * sizeof(float));
memcpy ( p, (float[]){2,60,-23,55,7,9,-2.55,-66.9,9}, 9 * sizeof(float));
是的。指针p
的值保持不变。它仍然指向动态分配的内存。
p[0]
,第一个元素现在的值为 2.0f
,
p[1]
,下一个元素现在的值为 60.0f
,等等
一些编码建议:
int main(void) {
#define COUNT 9
float *p = malloc(sizeof *p * COUNT);
if (p) {
memcpy(p, (float[COUNT] ) { 2, 60, -23, 55, 7, 9, -2.55f, -66.9f, 9 },
sizeof *p * COUNT);
//...
}
free(p);
return 0;
}