函数调用后,参数指针将不保留其值

时间:2019-04-25 08:30:36

标签: c des

我将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时,我什么也没得到,但我希望得到存储在函数中的值。

3 个答案:

答案 0 :(得分:2)

在这一行:

K1 = P8_swap(P10leftPtr, P10rightPtr);

您更改了K1的值,但是该更改是该函数的 local ,并且不会更改K1ptrmain的值。

如果要在K1ptr中更改main的值,则需要将指向K1ptr指针传递给该函数。但是,在初始化K1ptr指向字符数组K1[9]时,这似乎有些奇怪。我的猜测是您不想更改函数中的指针值,而只是将一些数据复制到“指向”数组中。

顺便说一句:

您的P8_swap是错误的。您返回一个指向P8_Output的指针,该指针是一个局部变量。绝对不要那样做!当函数返回时,局部变量超出范围(aka不再存在),因此返回的指针指向非法内存。如果您确实想要这样的东西,则必须使用动态内存分配。

答案 1 :(得分:0)

函数参数K1K2的定义:

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