gpt4 book ai didi

c - 为什么这个类似的函数不会抛出相同的错误?

转载 作者:太空宇宙 更新时间:2023-11-04 08:08:39 25 4
gpt4 key购买 nike

我有两个具有相同返回类型的函数:

char * getRandomWord(char wordlist[WORDLIST_LENGTH][WORD_LENGTH]) {
int random = rand() % WORDLIST_LENGTH;
return wordlist[random];
}

char * revealInString(char * s, int * r) {
size_t strLength = strlen(s);
char revealedString[strLength + 1];
for (int i = 0; i < strLength; i++) {
revealedString[i] = '_';
}
for (int i = 0; i < strLength; i++) {
if (r[i] != NULL) {
int positionToReveal = r[i];
revealedString[positionToReveal] = s[positionToReveal];
}
}
revealedString[strLength - 1] = '\0';
return revealedString;
}

第一个没有问题,而我的 IDE (CLion) 在第二个中显示了一个问题:Value escapes the local scope

为什么第二个函数显示该错误,而第一个函数也毫无问题地返回一个字符数组?

最佳答案

语法 char revealedString[N] 定义分配在堆栈上的 VLA(C99 功能)。

...但是您的revealInString 函数然后返回指向堆栈分配内存的指针。这是一个错误:当您的函数返回时,堆栈被弹出,因此 revealedString 现在指向无效内存。

相比之下,您的第一个示例返回一个指向在调用函数之前分配的内存的指针。

虽然在堆栈上分配然后返回的函数可以工作(前提是调用者不再进行调用),但这是一个非常糟糕的主意,因为它依赖于未定义的行为。

您有两种解决问题的方法:

  1. 让调用者在调用 revealInString 之前在堆栈上分配 VLA
  2. 在堆上分配数组(使用 callocmalloc)并确保调用者在完成后调用 free。<

示例 1:

char revealedStringBuffer[ strlen(s) + 1 ];
revealInString( revealedStringBuffer, r ); // and change `revealInString` to return void

示例 2:

char * revealInString(char * s, int * r) {
size_t strLength = strlen(s);
char* revealedString = calloc( strLength + 1, sizeof(char) );
if( revealedString == NULL ) die("calloc failure.");

for (int i = 0; i < strLength; i++) {
revealedString[i] = '_';
}
for (int i = 0; i < strLength; i++) {
if (r[i] != NULL) {
int positionToReveal = r[i];
revealedString[positionToReveal] = s[positionToReveal];
}
}
revealedString[strLength - 1] = '\0';
return revealedString;
}

// Usage:
char* revealedString = revealInString( s, r );
free( revealedString );

关于c - 为什么这个类似的函数不会抛出相同的错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40964787/

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