我将3个指针(键,K1Ptr,K2Ptr)作为参数传递给函数(keyGenerator),但是当函数调用结束时,只有键指针保留了函数调用中的值,而其他2个指针则没有。
我尝试了很多不同的事情,例如使用2个指针返回一个数组,或者我尝试不使用指针而改为传递2个数组。两次尝试都具有相同的结果,但函数调用后没有保留值。
char K1[9], K2[9];
char *K1ptr, *K2ptr;
K1ptr = K1;
K2ptr = K2;
keyGenerator(key, K1ptr, K2ptr);
printf("Key. %s\n", key);
printf("K1. %s\n", K1Ptr);
printf("K2. %s\n", K2Ptr);
\
void keyGenerator(char *key, char *K1, char *K2) {
char P10_Left[6];
char P10_Right[6];
char *P10leftPtr, *P10rightPtr;
printf("Starting key: %s\n", key);
//P10 Operation first step
P10_swap(key);
printf("P10swap key: %s\n", key);
//Initializing the left and right arrays
int i;
for(i=0;i<5;i++) {
P10_Left[i] = key[i];
P10_Right[i] = key[i+5];
}
P10_Left[5] = '\0';
P10_Right[5] = '\0';
P10leftPtr = P10_Left;
P10rightPtr = P10_Right;
//The left half shift
LS(P10leftPtr, 1);
//The right half shift
LS(P10rightPtr, 1);
//P8 swap starts here
K1 = P8_swap(P10leftPtr, P10rightPtr);
printf("K1 key: %s\n", K1);
//P8 swap ends here
//After we find K1 we need to shift the 2 halves again, 2 times to the left this time
//The left half shift
LS(P10leftPtr, 2);
//The right half shift
LS(P10rightPtr, 2);
//After the 2 shifts we use P8 operation again on the new halves
//P8 swap starts here
K2 = P8_swap(P10leftPtr, P10rightPtr);
printf("K2 key: %s\n", K2);
//P8 swap ends here
} //
char* P8_swap(char *left_key, char *right_key) {
int P8[8] = {6, 3, 7, 4, 8, 5, 10, 9}; //key possitions after P8 operation
char P8_Output[9];
char *K1; //They key after the P8 swap
char keyLR[11]; //The left and right halves will be stored together here
int i;
//The two halves become one so that we can do the P8 swap
for(i=0;i<5;i++) {
keyLR[i] = left_key[i];
keyLR[i+5] = right_key[i];
}
//P8 swap
for(i=0; i<8; i++) {
P8_Output[i] = keyLR[P8[i]-1]; //P10[i] - 1 because the possitiongs in P10 are from 1-10 and not 0-9
}
P8_Output[8] = '\0';
K1 = P8_Output;
return K1;
}
在函数keyGenerator之后,当我打印K1Ptr和K2Ptr时,我什么也没得到,但我希望得到存储在函数中的值。
答案 0 :(得分:2)
在这一行:
K1 = P8_swap(P10leftPtr, P10rightPtr);
您更改了K1
的值,但是该更改是该函数的 local ,并且不会更改K1ptr
中main
的值。
如果要在K1ptr
中更改main
的值,则需要将指向K1ptr
的指针传递给该函数。但是,在初始化K1ptr
指向字符数组K1[9]
时,这似乎有些奇怪。我的猜测是您不想更改函数中的指针值,而只是将一些数据复制到“指向”数组中。
顺便说一句:
您的P8_swap
是错误的。您返回一个指向P8_Output
的指针,该指针是一个局部变量。绝对不要那样做!当函数返回时,局部变量超出范围(aka不再存在),因此返回的指针指向非法内存。如果您确实想要这样的东西,则必须使用动态内存分配。
答案 1 :(得分:0)
函数参数K1
和K2
的定义:
void keyGenerator(char *key, char *K1, char *K2)
阴影全局变量:
char K1[9], K2[9];
并且由于函数参数在函数范围内是局部的,因此实际上它们是分配的,但是值不会传播到其他地方定义的变量。
尝试使用:
void keyGenerator(char *key, char **K1, char **K2)
并调用它:
keyGenerator(key, & K1ptr, & K2ptr);
还需要根据P8_swap函数来更改函数内部对K1的分配。
答案 2 :(得分:0)
问题在这里
K1 = P8_swap(P10leftPtr, P10rightPtr);
在这里
K2 = P8_swap(P10leftPtr, P10rightPtr);
基本上,您正在覆盖指针的值,以便它们指向其他最终在函数调用结束时销毁的东西。
因此,您需要将P8_swap()
调用的返回值复制到指针的内容中,如下所示:
char* tmp = P8_swap(P10leftPtr, P10rightPtr);
memcpy(K1, tmp, strlen(tmp)+1);
...
tmp = P8_swap(P10leftPtr, P10rightPtr);
memcpy(K2, tmp, strlen(tmp)+1);
您可以详细了解memcpy
here。
或基本的for循环也可以做到
char* tmp = P8_swap(P10leftPtr, P10rightPtr);
for(int i = 0; i < strlen(tmp); i++) {
K1[i] = tmp[i];
}
编辑:
正如@ 4386427所指出的那样,tmp
在这种情况下将是不安全的指针,因为同时返回值P8_swap()
可能会被破坏-因为它是在函数中本地定义的
但是,如果为值(在函数内)动态分配内存(如我最初所假设的那样),则可以安全使用指针。 See demo。