在函数调用之后,参数指针不保留它们的值[重复]

问题描述 投票:2回答:3

这个问题在这里已有答案:

我传递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;

}

在我打印K1Ptr和K2Ptr之后的函数keyGenerator之后我什么也得不到,但我希望得到函数内存储的值。

c des
3个回答
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


2
投票

在这一行:

K1 = P8_swap(P10leftPtr, P10rightPtr);

你改变了K1的值,但是这个改变是函数的局部变化,不会改变K1ptrmain的值。

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

BTW:

你的P8_swap是错的。你返回一个指向P8_Output的指针,这是一个局部变量。永远不要那样做!当函数返回时,局部变量超出范围(也就是不再存在),因此返回的指针指向非法内存。如果你真的想要这样的东西,你必须使用动态内存分配。


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的赋值。

© www.soinside.com 2019 - 2024. All rights reserved.