我已经设法生成了一个完全正常的代码并完全按照它应该做的。我的问题是:我完全不明白为什么。根据我的理解,它应该不起作用。
public class A {
private int id;
private static Point2D[] myArray = new Point2D[10];
public A(int id) {
this.id = id;
if (myArray[0] == null) { // I want the array to be initialized only once.
initArray(id);
}
}
private static void initArray(int id) {
for (int i = 0; i < myArray.length; i++) {
myArray[i] = new Point2D(id, id);
}
}
}
我可以发誓我必须在memcpy中指定#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;
}
(1 * 12 * 32)的大小才能使代码生效。但如果我这样做,那就没有。如果我指定sizeof(char) * 384
,它只能工作并产生正确的结果。为什么56?这个价值应该是什么意思?我确实知道我有6个键:值对,而6 * 8 + 8是56,但我仍然没有得到它。
[编辑]
用例是这样的:
程序根据yaml配置文件中提供的连接参数(IP地址,端口)连接到服务器。该文件的简约版本可能如下所示:
sizeof(char) * 56
程序需要key:value对的值,因为它们被传递给与服务器建立连接的函数。所以,我需要做的是解析配置文件并查找允许的键(参数可以是任何东西;我只知道键)。例如,如果找到密钥“tx_addr”,程序就知道该密钥的值应作为建立服务器连接的函数的IP地址参数传递。
答案 0 :(得分:1)
我认为您的目标是将所有关键:值对从tmp
复制到params
。
您无法使用单个tmp
将params
的所有键:值对复制到memcpy
。您无法确定malloc
已经为您提供了两个连续的内存区域。
您必须逐个复制字符串。
parseFile(tmp, argv[1]);
for (i=0; i<PARAMS; i++) {
memcpy(params[i], tmp[i], 32);
}
为了获得两个连续的内存区域(以便您可以使用单个memcpy
进行复制),您需要将变量分配为2D数组(https://stackoverflow.com/a/40847465/4386427和https://stackoverflow.com/a/42094467/4386427)。