将随机名称从函数返回到main

时间:2013-06-17 04:21:56

标签: c

C和本网站的新手。我试图在函数中的数组数组中随机选择一个名称。然后将该随机名称返回到main,我可以使用它:

#include <stdio.h>
#include <time.h>     // For rand function

int  random_number(int, int);

char * random_name(char *);

int main(void)
{
char * main_pointer;

printf("\nIn main:\nmain_pointer = %s\n", main_pointer);

return 0;
}
char * random_name(char * MAIN_POINTER)
{
int x = random_number(0,7);

char random[7][5] =
{"0Sam", "1Sam", "3Sam", "4Sam", "5Sam", "6Sam", "7Sam"};

MAIN_POINTER = &random[x][0];

printf("In the function:\nrandom = %s\nMAIN_POINTER = %s\n", (&random[x][0]), MAIN_POINTER);

return MAIN_POINTER;

}
int random_number(int min, int max)
{
int roll;
int maximum = max - min;

srand(time(NULL));
roll = (rand() % maximum) + min;
return roll;
}

示例运行:

In the function:
random = 0Sam
MAIN_POINTER = 0Sam

In main:
main_pointer = Ø'Þ¿¦¼i·

你可以看到它变成了垃圾。

5 个答案:

答案 0 :(得分:4)

发布的代码有几个问题,但让我们从这开始:

char * main_pointer;

这总是一件坏事,它将“main_pointer”留作未初始化。你的编译器应该告诉你这个。

test.c:在函数'main'中: test.c:12:7:警告:'main_pointer'在此函数中未初始化使用[-Wuninitialized]

如果您正在使用GCC,则添加“-Wall”编译器选项以获得更多诊断输出,并始终尝试为您的变量分配默认值,例如

char * main_pointer = NULL;

下一个问题:

char * random_name(char * MAIN_POINTER)
....
MAIN_POINTER = &random[x][0];

虽然这是合法的,但我认为它并不符合您的期望。当您将指针作为函数参数传递时,指向的地址将被传递并存储在新的指针变量中。对此新副本进行的任何更改都会在函数返回时丢失。

char* test(char* in)
{
    in = in + 1;
    return in + 10;
}

....
    char* p = (char*)1000; // 'p' now points to memory location 1000.
    char* q = test(p);
    printf("p = %p, q = %q\n", p, q);

将打印:

1000 1011

本质上,指针就像变量一样工作,在这种情况下,“in”被初始化为与“p”相同的值,地址“1000”,当我们向它添加1时,它只是私有变量“in”那被修改了。

指针的唯一特性是你可以“取消引用”它。如果您希望“random_name”函数能够更改指针main_pointer,则需要传递指针的地址并取消引用:

void random_name(char** main_pointer) // address of the pointer
{
    ...
    (*main_pointer) = random[x];
}

由于你的代码中缺少对random_name的调用,我无法判断你是否希望像这样接收它:

main_pointer = random_name(main_pointer);

在这种情况下似乎没有很多意思将它传递给函数,因为你从未真正使用过它。

您的代码将遇到的另一个问题是您正在尝试使用指针将数据从函数范围内提升到堆栈上方的数据。这很危险。如果您需要数据在函数外保持或可见,则需要在全局范围内声明数据或者给出“静态”属性。

const char* random_names[] = { "0Sam", "1Sam", "2Sam", ... };

// or

void random_name(const char** main_pointer)
{
    size_t x = random(0, 7);
    static const char* random_names[] = { "0Sam", "1Sam", "2Sam", ... };
    (*main_pointer) = random_names[x];
}

答案 1 :(得分:3)

你永远不会在main()函数中设置main_pointer的值,它只有一个垃圾地址。

答案 2 :(得分:2)

像这样修复

#include <stdlib.h>
int  random_number(int, int);
const char *random_name(void);

int main(void){
    const char * main_pointer;

    main_pointer = random_name();
    printf("\nIn main:\nmain_pointer = %s\n", main_pointer);

    return 0;
}
const char *random_name(void){
    int x = random_number(0,7);
    const char *random[7] =
        {"0Sam", "1Sam", "3Sam", "4Sam", "5Sam", "6Sam", "7Sam"};

    return random[x];
}

答案 3 :(得分:1)

我已尝试更正您的程序,现在运行正常。有关说明,请参阅注释内联您的代码。

正确运行代码:

#include“stdio.h”

#include“stdlib.h”

#include“string.h”

#include“time.h”//对于rand函数

int random_number(int,int);

char * random_name(char *);

int main(void)

{

    char * main_pointer=NULL; /*Uni:Initialize this pointer to NULL*/

    /*Uni: You have still not allocated any memory/storage for main_pointer 
      and the main_pointer basically points NOWHERE at this point,so 
      printing its value doesnot make any sense here */

    /*Uni:Allocate memory for main_pointer*/
    main_pointer = (char *)malloc(5*sizeof(char));
    /*Uni:Call the random_name function to get the random Name*/
    random_name(main_pointer);

    /*Uni:Now print mainpointer */
    printf("\nIn main:\nmain_pointer = %s\n", main_pointer);

    return 0;}

char * random_name(char * MAIN_POINTER)

{

   int x = random_number(0,7);

    char random[7][5] =
    {"0Sam", "1Sam", "2Sam", "3Sam", "4Sam","5Sam","6Sam"};


/*Uni: When you declare any Array, the array name itself is a pointer,
  so here &random is a double pointer 
  Note: If you want to return only the VALUE of nth string,
  then simply writing random[x] would suffice
  random[0]: First string
  random[1]: Second string
  .
  .
  .
  random [6]: 7th string
  So,we can access any string at nth position as random[n];*/


 /*Commenting this as here double char pointer is being assigned to
  single char pointer*/
 /*MAIN_POINTER = &random[x][0];*/

 /*Uni:Copying string STARTING  at Random[x] position.Each row of 
   random_Array holds a string of length 5 characters*/

/*Range check ,so that we don`t read out of bound array */ 
if(0<=x<=6)
{
    printf("Uni:Value of x %d, Random Name %s",x,random[x]);
    strncpy(MAIN_POINTER,random[x],5);
}

/*Uni: No need of returning pointer here,as we have copied 
  the string value (Random   name) in MAIN_POINTER already*/
 return MAIN_POINTER;}

int random_number(int min,int max)

{

int roll;

int maximum = max - min;


srand(time(NULL)); 

roll = (rand() % maximum) + min;

return roll;

}

答案 4 :(得分:0)

变量 random [7] [5] 是函数 random_name 的本地变量。一旦函数返回,变量将过期/不可用。

在您的情况下,返回指向变量随机的指针将导致未定义的行为

<强>解决方案

1)将变量随机移动到全局 2)将变量 random 移动到main函数并将变量作为参数传递