【问题标题】:Struct member array; creation and access through use of return pointer type function结构成员数组;通过使用返回指针类型函数创建和访问
【发布时间】:2022-12-12 18:45:29
【问题描述】:

前言。

这是我在这里的第一个问题,很抱歉,如果它不符合标准格式或问题的措辞方式等。 我并不是不知道这可能已经在深处的某个地方得到了回答,但是我已经尽我所能进行了搜索,但我找不到任何足够相似的东西来帮助我理解我做错了什么。

我是 C 语言的新手,有编程经验,但我确实缺乏大量的基础知识。这将通过我尝试解释和描述问题来证明。我很欣赏反馈,但老实说,我对理解计算机科学定义的能力很低,所以我希望能理解应用示例而不是引用。提前感谢额外的麻烦!


好的,对于实际问题;

我试图在根本不使用 list() 的情况下创建一个列表,到目前为止,我已经到了想要确认我确实在做的地步。

  • 创建一个函数,该函数返回一个结构,其中包含我想要的任意长度的列表/数组。
  • 通过查看结构成员元素的内容是否为 arraytest.. 的内容来检查该函数是否执行了我希望它执行的操作。

标题包括以下内容

//header 

typedef struct {
    size_t length;
    int elements[];
}list_t;

list_t *new_list(size_t length, int elements[]); 

到目前为止的源文件(放弃包含/定义,因为它在这里真的不相关)

list_t *new_list(size_t length, int elements[])
{
    list_t* newList = (list_t*)malloc(sizeof(list_t*) + sizeof(int) * length);
    
    newList->length = length;
    newList->elements[length - 1];

    return newList;
}


int main()
{
    int arraytest[] = {1, 2, 3, 4, 5}; 
    int length      = 6;
    
    list_t* list = new_list(length, arraytest);

    for(int i = 0; i < length; i++)
    {
        printf("The address of [%d] element : %p\n", i, &list->elements[i]);
        printf("The value of [%d] element : %u\n", i, list->elements[i]);
        printf("The pointer value of [%d] element : %p\n", i, list->elements[i]);
        printf("No [] index iteration of [%d] element : %p\n", i, list->elements);
    }
   
    return 0;
}

从主要可以看出,我试图在精神上抓住我认为可能导致我“困惑”的不同事物。在这个..

我显然试图通过打印元素来确认我确实拥有我的数组,可通过索引访问。
通常,我以前在结构中完成过此操作,但始终使用预定义的大小并且从不通过函数指针返回(或与此相关的数组参数)。它大部分都很好,我没有遇到任何问题。

但是,我想我想在这里得到的是我本质上缺少的是什么?

我想到了一些事情;

  1. 要么我错过了 C 使用按值传递的事实,并且不知何故函数返回指针没有被这样对待,无论是在 main 中还是由函数 new_list 本身,我真的不知道。

  2. 我使用的语法不是我试图获得的确认的正确语法,我已经拥有了我想要的东西,但我遗漏了一些极其微不足道的东西。

  3. 函数 *new_list 是错误的,我没有返回我想返回的内容。

  4. 以上的任何组合,可能还有其他东西,或者完全是其他东西。

    我已经尝试从打印件中查看它是否是一个取消引用的东西,但是由于我已经在使用数组,所以老实说我只是尝试添加一些不同的东西,因为我觉得数组和指针的区别不是100% 清晰。

    例如,我知道,或者更确切地说,我认为我知道使用 * 作为指针与取消引用运算符之间的区别,获取 & 和 -> 的地址用于结构成员访问等等,我想这对我来说很清楚。但是我不能说老实说,一旦你在混合中加入数组,我就明白了。

    无论如何,我要到此为止,我认为这说明了重点 (++)。

    哦,程序执行并运行,我没有收到任何错误,只有一些关于格式化的编译器警告,我认为这不应该是真正的问题。

    再一次感谢你的帮助 !

【问题讨论】:

  • 作为声明,newList-&gt;elements[length - 1]; 没有任何用处。它从数组的元素length - 1 中获取值,然后丢弃该值。
  • 另请注意,您永远不会初始化数组及其元素。数组中的所有元素都会有不定值。
  • malloc(sizeof(list_t*) + ... --> malloc(sizeof(list_t) + ... 你不想要 sizeof 指针。
  • 是的,您有一个灵活的数组成员,malloc 调用(一旦按照上面的@DavidRanieri 提到的那样修复)将为数组分配内存。它会不是以任何方式初始化分配的内存。 malloc 本身只分配内存,不初始化内存。也没有显示代码可以做到这一点。您永远不会将内存设置为任何值,也永远不会分配给任何元素。
  • 删除之前的评论;我明白你的意思了。。

标签: c


【解决方案1】:
  • list_t* newList = (list_t*)malloc(sizeof(list_t*) + sizeof(int) * length);错了,应该是sizeof(list_t) + ...
  • newList-&gt;elements[length - 1]; 是空操作,它没有副作用,编译器应该告诉你很多。 What compiler options are recommended for beginners learning C? 您可能打算将项目设置为零。
  • 理想情况下检查 malloc 是否未成功并返回 NULL。
  • new_list(length, arraytest);你骗函数说你只传了5条就传了6条。
  • printf("The pointer value of [%d] element : %p ", i, list->elements[i]); 没有意义,这不是指针。正如在您的第一行 printf 中已经建立的那样,您必须写 &amp;list-&gt;elements[i] 才能获得地址。几个 printf 语句中存在同样的问题。
  • free() 使用完所有动态分配的项目。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-14
    • 1970-01-01
    • 2015-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多