C 如何将字符串存储到结构中声明的字符指针中
这是我的代码:C 如何将字符串存储到结构中声明的字符指针中,c,C,这是我的代码: #include<stdio.h> struct p{ char* d; }; typedef struct p* pt; int main(){ pt opt; opt=(pt)malloc(sizeof(struct p)); scanf("%s",(opt->d)); printf("%s",opt->
#include<stdio.h>
struct p{
char* d;
};
typedef struct p* pt;
int main(){
pt opt;
opt=(pt)malloc(sizeof(struct p));
scanf("%s",(opt->d));
printf("%s",opt->d);
getch();
return 0;
}
#包括
结构p{
char*d;
};
类型定义结构p*pt;
int main(){
pt-opt;
opt=(pt)malloc(sizeof(struct p));
scanf(“%s”,(opt->d));
printf(“%s”,opt->d);
getch();
返回0;
}
每次我运行它时,它都会很好地接受并打印字符串,但会出现错误。
在调试时,它会告诉您存在分段错误,但不会指出错误所在?
出了什么问题,它似乎相当正确。您必须为
char*d代码>
int main(){
pt opt;
opt=(pt)malloc(sizeof(struct p));
opt->d = malloc( sizeof( char )* 80);
scanf("%s",(opt->d)); //this might overflow
您使用malloc
为结构分配空间,但不为要读入的字符串分配空间。你也需要这样做。下面是根据您的问题改写的一个示例:
pt opt = malloc(sizeof(struct p));
opt->d = malloc(MAX_STRING_LENGTH);
您需要将正确的缓冲区传递给scanf
,而不仅仅是指向某个地方的指针
struct p{
char* d;
};
typedef struct p* pt;
int main(){
pt opt;
opt=(pt)malloc(sizeof(struct p));
opt->d = malloc(expected_max_len + 1);
scanf("%s",(opt->d));
printf("%s",opt->d);
free(opt->d);
getch();
return 0;
}
scanf将扫描的字符串放入char缓冲区。但是在您的代码中,您的char指针没有指向任何东西,它应该指向缓冲区
如果您的gcc>2.7,您可以使用“%ms”
。这将允许scanf为指针分配内存
scanf("%ms",(opt->d));
是的,问题是你必须为char*d分配内存代码>
int main(){
pt opt;
opt=(pt)malloc(sizeof(struct p));
opt->d = malloc( sizeof( char )* 80);
scanf("%s",(opt->d)); //this might overflow
1) 为char*d
like(在上述回复中提到)分配内存
opt->d=malloc(预期最大长度+1)代码>
2) 或者您可以在结构中声明具有最大缓冲区长度的缓冲区:
chard[MAX_LENGTH]
您不需要在C程序中强制转换malloc
的返回值。@CarlNorum更准确地说,您不能强制转换它。请不要将void*
强制转换为t*
。您应该注意1和2具有不同的效果,需要采取不同的措施。