繁体   English   中英

C中的指针和本地数组

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM