gpt4 book ai didi

c - 这个数组大小是怎么来的呢?

转载 作者:行者123 更新时间:2023-11-30 14:49:20 25 4
gpt4 key购买 nike

我已经成功地编写了一个代码,该代码运行得非常好并且完全符合其应有的功能。我的问题是:我完全不明白为什么。根据我的理解,它不应该起作用。

#define PARAMS 12

char** parseFile(char* tmp[], char* location) {

// Parse a file at <location> and retrieve 6 key: value pairs from it.
// All key: value pairs are stored in tmp, resulting in an array of
// 12 char pointers, each pointing to a char array that contains either
// a key or a value.

// ...

do {
yaml_parser_scan(&parser, &token);
if (token.type == YAML_SCALAR_TOKEN && i<PARAMS) {
strcpy(tmp[i], (char*)token.data.scalar.value);
i++;
}
if (token.type != YAML_STREAM_END_TOKEN) {
yaml_token_delete(&token);
}
} while (token.type != YAML_STREAM_END_TOKEN);

// ...

return tmp;
}

int main(int argc, char* argv[]) {
int i=0;
char **tmp = (char **)calloc(PARAMS, sizeof(char *));
char **params = (char **)calloc(PARAMS, sizeof(char *));
for (i=0; i<PARAMS; i++) {
tmp[i] = (char *)calloc(32, sizeof(char));
params[i] = (char *)calloc(32, sizeof(char));
}

memcpy(params, parseFile(tmp, argv[1]), sizeof(char) * 56); // WHY 56?
for (i=0; i<PARAMS; i++) {
printf("PARAM_[%d] = %s\n", i, params[i]);
}

free(tmp);
free(params);

return 0;
}

我可以发誓,我必须在 memcpy 中指定 sizeof(char) * 384 (1 * 12 * 32) 的大小才能使代码正常工作。但如果我这样做了,那就不会了。仅当我指定 sizeof(char) * 56 时,它才有效并产生正确的结果。为什么是56?这个值应该意味着什么?我确实意识到我有 6 个键:值对,并且 6 * 8 + 8 是 56,但我仍然不明白。

[编辑]

用例是这样的:

程序根据 yaml 配置文件中提供的连接参数(IP 地址、端口)连接到服务器。该文件的简约版本可能如下所示:

---
# Connection parameters
tx_addr: 192.168.1.124
tx_port: 8080

程序需要键:值对的值,因为这些值被传递给建立与服务器的连接的函数。所以,我需要做的是解析配置文件并查找允许的键(参数可以是任何东西;我只知道键)。例如,如果找到键“tx_addr”,则程序知道该键的值应作为建立服务器连接的函数的 IP 地址参数传递。

最佳答案

我假设您的目标是将所有键:值对从 tmp 复制到 params

您无法使用单个 memcpy 将所有键:值对从 tmp 复制到 params。您无法确定 malloc 是否为您提供了两个连续的内存区域。

您必须逐一复制字符串。

parseFile(tmp, argv[1]);
for (i=0; i<PARAMS; i++) {
memcpy(params[i], tmp[i], 32);
}

为了获得两个连续的内存区域(以便您可以使用单个 memcpy 进行复制),您需要将变量分配为二维数组( https://stackoverflow.com/a/40847465/4386427https://stackoverflow.com/a/42094467/4386427 )。

关于c - 这个数组大小是怎么来的呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49647627/

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