[英]Pointers and local arrays in C
为什么我的函数printTable不打印我的数组的内容? 例如,从我的数组mysteryword
词中存储的整个单词'oui',它只打印'o'?
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <time.h>
#define libraryDimension 12
char* getFirstElementPointerOfMysteryWord(void);
char getCarac(void);
void printTable(char*ptr,int dimension);
/* Main program*/
int main() {
//getCarac();
char *pointerForFirstElement = getFirstElementPointerOfMysteryWord();
int tableDimension = 3;
printTable(pointerForFirstElement, tableDimension);
return 0;
}
此函数旨在提供没有参数的单词选择,并返回单词数组的第一个元素的地址。
char *getFirstElementPointerOfMysteryWord(void) {
int randomNumbers[3] = {0};
char mysteryWord[4];
char wordLibrary[libraryDimension];
wordLibrary[0] = '#';
wordLibrary[1] = 'n';
wordLibrary[2] = 'o';
wordLibrary[3] = 'n';
wordLibrary[4] = '#';
wordLibrary[5] = 'o';
wordLibrary[6] = 'u';
wordLibrary[7] = 'i';
wordLibrary[8] = '#';
wordLibrary[9] = 'q';
wordLibrary[10] = 'u';
wordLibrary[11] = 'i';
wordLibrary[12] = '\0';
int j=0;
for (int i = 0; i<libraryDimension; i++) {
if(wordLibrary[i] == '#') {
randomNumbers[j] = i;
j++;
}
}
srand(time(NULL));
int index = rand() % 3;
int randomNumber = randomNumbers[index];
int k=0;
for (int i = randomNumber ; i< libraryDimension-1 ; i++) {
if(wordLibrary[randomNumber+k+1] == '#'){
break;
}
else{
mysteryWord[k] = wordLibrary[randomNumber+1+k];
k++;
}
}
return mysteryWord;
}
这是我的代码无法正常工作的部分。
void printTable(char *ptr,int dimension) {
for (int i = 0; i <dimension ; i++) {
printf("%c",*(ptr+i));
}
}
char getCarac(void){
char carac;
carac = getchar();
return carac;
}
在函数中声明变量时,它将在堆栈上分配。 当变量超出范围,即函数结束时,变量消失(堆栈是函数的本地),因此通过返回数组的地址,您将返回不再存在的地址。
而是使用malloc在堆上分配存储
char *mysteryWord = malloc(4);
或者更好,让它在函数外声明,然后传递给函数填充。
void getFirstElementPointerOfMysteryWord(char* mysterword, size_t maxLen)
问题就在这里
char *getFirstElementPointerOfMysteryWord(void)
{
char mysteryWord[4];
/* other stuff */
return mysteryWord;
}
当函数返回时, mysteryWord
不再存在。 调用者对其进行任何解除引用(例如检查其内容)或将其传递给另一个解除引用的函数(您的代码所做的)会给出未定义的行为。
您需要确保调用者接收的任何指针,它继续指向调用者将存在的内容。 这可以通过各种方式完成,每种方式都有不同的权衡。 可能最容易的是调用者通过一个数组,其中有4个元素作为该函数的参数(如果调用者拥有它,它将不会停止存在,直到调用者中的当前作用域结束)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.