首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数组的动态分配问题C

数组的动态分配问题C
EN

Stack Overflow用户
提问于 2016-12-21 15:18:00
回答 3查看 961关注 0票数 7

说清楚,我的代码工作得很好。我关心的问题是,我不确定我的数组分配类型。

我的任务相当简单:我需要在动态分配的数组中执行一些操作。

然而,数组中已经给出了这些值。因此,我需要在它中添加这些值。

为了保持对向量的动态分配,并避免以下情况:

代码语言:javascript
复制
float *p;
 p = malloc(9 * sizeof(float));
* p=2;
* (p+1)=60;
* (p+2)=-23;
.
.
.
* (p+8)=9;

我试过这样做:

代码语言:javascript
复制
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中。那么,我的问题是:我的数组仍然是动态分配的?

编辑:我的问题涉及第二代码。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-12-21 16:04:45

我的数组仍然是动态分配的?

代码语言:javascript
复制
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的值,等等。

一些编码建议:

代码语言:javascript
复制
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;
}
票数 6
EN

Stack Overflow用户

发布于 2016-12-21 15:20:48

首先,您没有(Y)数组,只有一个指向特定大小内存的指针。

第二,正如你提到的,(强调我的)

memcpy将静态分配的数组复制到 my p中。

因此,是的,指针仍然具有(或指向)动态分配的内存。

正如我们从C11上看到的,第7.24.2.1章

memcpy函数将n字符从s2指向的对象复制到s1指向的对象中。..。

因此,我们可以看到,对象本身并没有被更改/替换,只有被复制的内容。

票数 3
EN

Stack Overflow用户

发布于 2016-12-21 15:37:50

如果初始化值是常数,则可以使用复合文字。但是,代码容易出错.如果您忘记了文字中的一个元素,您将访问超出范围的数组。这会调用未定义的行为。

改变三件事:

代码语言:javascript
复制
// 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不“复制静态(联盟)分配的数组.”。这既不是数组的要求,也不是使用静态对象的复合文字,而是自动的。

警告:总是检查可能会遇到错误的函数的结果,如果函数做了任何事情,就会用于进一步的处理。malloc可以在错误时返回空指针。妥善处理好这件事!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41266109

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档