在C中打印一个字符?为什么奇怪?
Printing of a character in C? Why is it strange?
我正在尝试使用 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: /
我不明白为什么要打印这个正斜杠。我知道可能还有其他解决方案可以实现打印此目标的相同目标。但是,这是一个非常大的文件的精简版本,我需要知道为什么会这样。不幸的是,替代解决方案对我没有帮助。
提前致谢。
问题是 func_3
按值而不是指针传递其参数。这意味着,当您调用 func_3(aStruct)
时,它会将 aStruct 的内容复制到一个全新的 myStruct
对象中。然后 func_3
初始化它。最后它 returns 到 main
,扔掉了它的全新副本,给你留下了 aStruct
的原始未定义内容
解决办法是把func_3
改成void func_3(struct myStruct* Input)
我已经修复了你的代码。请看我的评论。
在此处查看输出: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);
}
结构在函数参数中按值复制;这意味着您正在更改 aStruct
的副本;原来的保持未初始化。您的函数还会泄漏内存 (malloc
),并且通常在指针使用方面存在其他问题。
此外,您将 "word" 打印为 %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;
}
因为在void func_3(struct myStruct Input)
中Input
只是aStruct
的一个副本。
aStruct
没有初始化,所以它的值是未定义的。
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;
}
我正在尝试使用 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: /
我不明白为什么要打印这个正斜杠。我知道可能还有其他解决方案可以实现打印此目标的相同目标。但是,这是一个非常大的文件的精简版本,我需要知道为什么会这样。不幸的是,替代解决方案对我没有帮助。
提前致谢。
问题是 func_3
按值而不是指针传递其参数。这意味着,当您调用 func_3(aStruct)
时,它会将 aStruct 的内容复制到一个全新的 myStruct
对象中。然后 func_3
初始化它。最后它 returns 到 main
,扔掉了它的全新副本,给你留下了 aStruct
解决办法是把func_3
改成void func_3(struct myStruct* Input)
我已经修复了你的代码。请看我的评论。
在此处查看输出: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);
}
结构在函数参数中按值复制;这意味着您正在更改 aStruct
的副本;原来的保持未初始化。您的函数还会泄漏内存 (malloc
),并且通常在指针使用方面存在其他问题。
此外,您将 "word" 打印为 %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;
}
因为在void func_3(struct myStruct Input)
中Input
只是aStruct
的一个副本。aStruct
没有初始化,所以它的值是未定义的。
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;
}