我正在尝试使用malloc / free组合在C中打印字符。结果很奇怪,我无法弄清楚原因:
# include <stdio.h>
# include <stdlib.h>
# include <netdb.h>
# include <unistd.h>
# include <sys/time.h>
struct myStruct
{
char* word;
int num;
};
void func_3(struct myStruct Input){
struct myStruct* addr;
addr = &Input;
addr = malloc(sizeof(struct myStruct));
(&Input) -> num = 7;
(&Input) -> word = "some stuff here";
printf("This is Input word %s\n", (&Input) -> word);
}
int main(int argc, char const *argv[])
{
struct myStruct myStruct_ptr;
struct myStruct aStruct;
func_3(aStruct);
printf("This is my struct's word: %c", aStruct.word);
return 0;
}
输出:
This is Input word some stuff here
This is my struct's word: /
这对我来说没有意义,为什么它打印这个正斜杠。我知道可能还有其他解决方案来实现打印这个目标。但是,这是一个非常大的文件的提炼版本,我需要知道为什么会发生这种情况。不幸的是,替代解决方案对我没有帮助 提前致谢。
答案 0 :(得分:2)
请参阅此处的输出:https://ideone.com/IP2AR1。
#include <stdio.h>
struct myStruct
{
char* word;
int num;
};
void func_3(struct myStruct *Input){
Input->num = 7; // <- edit struct member
Input->word = "some stuff here"; // <- edit struct member
printf("This is Input word %s\n", Input->word);
}
int main(int argc, char const *argv[])
{
struct myStruct aStruct;
func_3(&aStruct); // <- pass here
printf("This is my struct's word: %s\n", aStruct.word); // <- print char array
printf("This is my struct's word: %c", *aStruct.word); // <- print first char
return 0;
}
void func_3(struct myStruct Input){ // <- pointer needed
struct myStruct* addr; // <- not used
addr = &Input;
addr = malloc(sizeof(struct myStruct));
(&Input) -> num = 7; // <- not being saved
(&Input) -> word = "some stuff here"; // <- not being saved
printf("This is Input word %s\n", (&Input) -> word);
}
答案 1 :(得分:1)
问题是func_3
按值传递其参数,而不是通过指针传递。这意味着,当您致电func_3(aStruct)
时,它会将aStruct的内容复制到全新的myStruct
对象中。然后func_3
初始化它。最后它返回main
,丢弃其全新副本,留下原始未定义内容aStruct
解决方案是将func_3
更改为void func_3(struct myStruct* Input)
答案 2 :(得分:1)
结构在函数参数中按值复制;这意味着您要更改aStruct
的副本;原件仍然没有初始化。您的函数也会泄漏内存(malloc
)并且通常还会出现指针使用的其他问题。
此外,您正在打印&#34;字&#34;作为%c
代替%s
;这通常会打印指针值的第一个字节,但它实际上可能是未定义的行为,因为指针不必与char兼容。
您应该将func_3
指针传递给结构而不是实际结构:
void func_3(struct myStruct *input){
input->num = 7;
input->word = "some stuff here";
printf("This is Input word %s\n", input->word);
}
int main(void)
{
struct myStruct aStruct;
func_3(&aStruct);
printf("This is my struct's word: %s", aStruct.word);
return 0;
}
答案 3 :(得分:1)
aStruct
不是指针。您无法在此功能中使用malloc
。
aStruct.word
是字符串第一个元素的指针。使用*aStruct.word
或aStruct.word[0]
。 func_3
更改元素Input
,因此您必须使用*Input
和func_3(&aStruct);
。
显示以下代码:
# include <stdio.h>
# include <stdlib.h>
struct myStruct
{
char* word;
int num;
};
void func_3(struct myStruct *Input){
(Input) -> num = 7;
(Input) -> word = "some stuff here";
printf("This is Input word %s\n", (Input) -> word);
}
int main(int argc, char const *argv[])
{
struct myStruct myStruct_ptr;
struct myStruct aStruct;
func_3(&aStruct);
printf("This is my struct's word: %c", *aStruct.word);
return 0;
}
答案 4 :(得分:0)
因为void func_3(struct myStruct Input)
Input
只是aStruct
的副本。
aStruct
未初始化,因此其值未定义。