1

New to C and this site. I am trying to randomly select a name in an array of arrays in a function. Then return that random name to main where I can use it:

#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;
}

Sample run:

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

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

As you can see it becomes garbage.

4

5 回答 5

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];
}
于 2013-06-17T04:40:12.023 回答
3

You never set the value for main_pointer in main() function, it just has a garbage address.

于 2013-06-17T04:23:43.620 回答
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];
}
于 2013-06-17T08:06:02.727 回答
1

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

正确运行代码:

#include “stdio.h”

#include “stdlib.h”

#include “字符串.h”

#include "time.h" // 用于 rand 函数

整数随机数(整数,整数);

字符 * 随机名称(字符 *);

诠释主要(无效)

{

    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;

}

于 2013-06-17T07:25:54.010 回答
0

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

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

解决方案

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

于 2013-06-17T06:27:46.133 回答