我是C语言的初学者,需要帮助将字符串保存到结构中。
(我尝试了多种方法来完成它,但是程序什么都不打印,或者我得到了(0xC0000005),或者程序关闭了。。(我尝试使用指针作为参数,但是效果是相同的,或者直接将scanf用于text.line等等。)如果有人简单地向我解释了应该如何做,我会很高兴-我感到我仍然不完全理解指针的概念,这就是问题所在; q。
lapply
答案 0 :(得分:2)
在C中将参数传递给函数时,它会创建该参数的副本,因此main中的text
变量与save_line中的变量不同。
您需要将指针text
传递到save_line函数,如下所示:
void save_line(label *text) {
printf("Write your name\n");
char *helper=malloc(30 * sizeof *helper);
scanf("%s", helper);
text->line = helper;
}
在主要方面:
void main(){
label text;
save_line(&text);
printf("%s", text.line);
}
答案 1 :(得分:2)
line
中没有空间来分配您的字符串,因为它只是一个未初始化的指针,因此您将必须为其保留一些内存。此外,您的函数正在分配未释放的内存(对于helper
,对于同一字符串,您将不需要两束不同的内存)。
#include<stdlib.h>
#include<stdio.h>
const uint8_t MAX_NAME_SIZE = 20;
typedef struct label{
char *line;
}label;
void save_line(label text){
printf("Write your name (max len %u chrs):\n",(MAX_NAME_SIZE-1));
scanf("%s", text.line);
}
void main(){
label text;
text.line = malloc(MAX_NAME_SIZE);
save_line(text);
printf("%s", text.line);
free(text.line);
}
我更喜欢在同一范围内分配和取消分配内存,以避免内存泄漏(在同一函数内部,在main内部等),因此为了保持结构,例如在main
。您应该考虑自己的设计,并分析label text;
应该具有的范围。
答案 2 :(得分:1)
您的代码在许多层面上都是错误的:
您可能想要这样的东西:
#include <stdio.h>
#include <stdlib.h>
typedef struct label {
char *line;
}label;
void save_line(label *text) { // use label *ttext instead of label text
printf("Write your name\n");
text->line = malloc(30 * sizeof *text->line); // no need for strcpy here anyway
scanf("%s", text->line);
}
int main() { // main should return int *
label text;
save_line(&text); // pass the pointer to text, not just text
printf("%s", text.line);
free(text.line); // free allocated memory
}
尽管如此,仍有改进的空间,例如scanf("%s"), ...
很危险,因为如果用户键入太多字符,则会导致缓冲区溢出。
答案 3 :(得分:0)
strcpy
仅将源指向的内容复制到目标。它不会在目标位置为要复制的内容分配空间。
如果您的平台有strdup
,则可以改用它:
text.line = strdup(helper);
如果没有,请在text.line
之前在strcpy
中分配一些空间
text.line = malloc(strlen(helper) + 1); // +1 for the null byte at the end
strcpy(text.line, helper);