这更多的是出于好奇,而不是我希望或需要它的工作方式。但当我做一些模特儿想测试一些东西的时候,我最终得到了这样的结果.不知道为什么不像我预料的那样起作用。
typedef struct {
char *a;
char *b;
char *c;
}mystruct;
void init_chars (char *arg)
{
arg = malloc (sizeof (char)*10);
arg = "0123456789";
printf ("%s\n", arg);
}
int main ()
{
mystruct *msp = malloc (sizeof (mystruct));
init_chars (msp->a);
init_chars (msp->b);
init_chars (msp->c);
printf ("%s, %s, %s\n", msp->a, msp->b, msp->c);
return 0;
}指纹..。
0123456789
0123456789
0123456789
(null),(null),(null)发布于 2015-08-26 05:40:08
当将值传递给函数参数时,C中有两件事
您正在按值传递,因此您将一些未初始化的值传递给该函数,并在函数之外不可见的函数中初始化它,您正在尝试在main()中使用未初始化的值,这将导致未定义的行为。
arg = "0123456789";如果要将字符串复制到某个内存位置,则需要memcpy()或strcpy()。
注意:使用未初始化的值会导致未定义的行为。
发布于 2015-08-26 05:50:54
您的代码有几个问题。这是固定代码:
/* Don't forget to include <stdio.h>, <stdlib.h> and <string.h> */
typedef struct {
char *a;
char *b;
char *c;
}mystruct;
void init_chars (char **arg) /* This should be char** as the address of a char* is passed */
{
*arg = malloc ( /*sizeof(char)* */ 11); /* sizeof(char) is 1 always. You don't need it */
/* Note the change of `arg` to `*arg` too */
/* And that I've used 11 and not 10 because there needs to be space for the NUL-terminator */
if(*arg == NULL) /* If the above malloc failed */
{
printf("Oops! malloc for *arg failed!");
exit(-1);
}
//arg = "0123456789"; /* You just lost the allocated memory as you make the pointer point to a string literal */
strcpy(*arg, "0123456789"); /* Use strcpy instead */
printf ("%s\n", *arg); /* *arg here */
}
int main ()
{
mystruct *msp = malloc (sizeof (mystruct));
if(msp == NULL) /* If the above malloc failed */
{
printf("Oops! malloc for msp failed!");
return -1;
}
init_chars (&(msp->a));
init_chars (&(msp->b));
init_chars (&(msp->c)); /* Pass address of variables rather than their value */
printf ("%s, %s, %s\n", msp->a, msp->b, msp->c);
free(msp->a);
free(msp->b);
free(msp->c);
free(msp); /* Free everything after use */
return 0;
}发布于 2015-08-26 05:56:50
typedef struct {
char *a;
char *b;
char *c;
}mystruct;
void init_chars (char **arg)
{
*arg = malloc (sizeof (char)*11);
if(*arg == NULL)
{
printf("malloc failed!");
exit(-1);
}
strcpy(*arg,"0123456789");
printf ("%s\n", *arg);
}
int main ()
{
mystruct *msp = malloc (sizeof (mystruct));
if(msp == NULL)
{
printf("malloc failed");
exit(-1);
}
init_chars (&msp->a);
init_chars (&msp->b);
init_chars (&msp->c);
printf ("%s, %s, %s\n", msp->a, msp->b, msp->c);
free(msp->a);
free(msp->b);
free(msp->c);
free(msp)
return 0;
}产出:
0123456789
0123456789
0123456789
0123456789,0123456789,0123456789
与您的代码进行比较,您将了解为什么
https://stackoverflow.com/questions/32218726
复制相似问题