gpt4 book ai didi

c - 将指针数组传递给函数

转载 作者:太空宇宙 更新时间:2023-11-04 02:02:05 25 4
gpt4 key购买 nike

  1. 我有一个名为 menu_item 的结构,如下所示:

    struct menu_item
    {
    char name[ITEM_NAME_LEN+1];
    };
  2. 在 main 中,我声明了一个指向该结构的指针数组(我对这部分是否正确?):

    struct menu_item * menu_items[NUM_MENU_ITEMS];
  3. 而且在 main 中,我正在尝试调用:

    init_menu(&menu_items[NUM_MENU_ITEMS]);
  4. init_menu 函数如下所示:

    void menu_init(struct menu_item * menu_items[NUM_MENU_ITEMS])
    {
    /* allocate memory for each element in the array */
    menu_items[NUM_MENU_ITEMS] = (struct menu_item *) malloc(sizeof(struct menu_item));
    }

但是我遇到了段错误,我做错了什么?提前致谢。

最佳答案

仔细查看您的函数。

void menu_init(struct menu_item * menu_items[NUM_MENU_ITEMS])
{
/* allocate memory for each element in the array */
menu_items[NUM_MENU_ITEMS] = (struct menu_item *) malloc(sizeof(struct menu_item));
}

您需要在函数的第二个参数中携带数组的大小。然而,NUM_MENU_ITEMS,似乎是一个全局的#define,因此你不需要携带第二个参数。

那么您正在访问一个越界单元格,menu_items[NUM_MENU_ITEMS]。我假设您知道索引从 0 开始到 NUM_MENU_ITEMS-1 结束。

在您的函数中,您需要在循环内分配内存。此外,您不需要转换 malloc 返回的内容。

因此,例如,您可以执行以下操作:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define ITEM_NAME_LEN 15
#define NUM_MENU_ITEMS 3

// Define the struct before main
struct menu_item {
char name[ITEM_NAME_LEN + 1];
};

// Give a synonym. Now struct menu_item is the same with menu_item_t.
// Notice the _t extension, which implies that this is a typedef.
typedef struct menu_item menu_item_t;

/**
* Given a pointer 'p' to an array of pointers
* (of type menu_item_t), allocate memory for
* every cell of the array.
*/
void init_menu(menu_item_t* p[]) {
int i;
for(i = 0; i < NUM_MENU_ITEMS; ++i) {
// for every cell of our array, allocate memory
p[i] = malloc(sizeof(menu_item_t));

// check that allocation for the i-th cell is OK
if(!p[i]) {
printf("Error in allocating %d item!\n\n", i);
return;
}
}
}

/**
* Given a pointer 'p' to an array of pointers
* (of type menu_item_t), de-allocate memory for
* every cell of the array.
*/
void delete_menu(menu_item_t* p[]) {
int i;
for(i = 0; i < NUM_MENU_ITEMS; ++i) {
// free the memory we had allocated for the i-th cell
free(p[i]);

// set the pointer to NULL
p[i] = NULL;
}
}

void fill(menu_item_t* p[]) {
int i;
for(i = 0; i < NUM_MENU_ITEMS; ++i) {
strcpy(p[i]->name, "myitem");
}
}

void print(menu_item_t* p[]) {
int i;
for(i = 0; i < NUM_MENU_ITEMS; ++i) {
printf("%s\n", p[i]->name);
}
}

int main(void) {
// Declare an array of pointers of menu_items_t.
// The size of the array is NUM_MENU_ITEMS
menu_item_t *menu_items[NUM_MENU_ITEMS];

init_menu(menu_items);

fill(menu_items);

print(menu_items);

delete_menu(menu_items);

return 0;
}

当我处理结构时,我总是有 this脑海中的例子。

关于c - 将指针数组传递给函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26063002/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com