这是我的代码:
#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;
}
每次我运行它,它接受并打印字符串罚款但发生错误。 在调试时,它告诉我有一个分段错误但是没有指向它的位置? 出了什么问题,这似乎是相当正确的。
答案 0 :(得分:2)
您使用malloc
为您的结构分配空间,但不是为您想要读入的字符串分配空间。您也需要这样做。以下是您的问题中的一个示例:
pt opt = malloc(sizeof(struct p));
opt->d = malloc(MAX_STRING_LENGTH);
答案 1 :(得分:2)
Yupp,问题是您必须为char * d;
1)为char * d
分配内存(在上面的回复中提到)
opt->d = malloc(expected_max_len + 1);
2)或者您可以在结构中声明具有最大缓冲区长度的缓冲区:
char d[MAX_LENGTH];
答案 2 :(得分:1)
scanf将扫描的字符串放入char缓冲区。但是在你的代码中,你的char指针并没有指向应该指向缓冲区的任何东西
如果你的gcc&gt; 2.7,你可以使用"%ms"
。这将允许scanf为指针分配内存
scanf("%ms",(opt->d));
答案 3 :(得分: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
答案 4 :(得分:0)
您需要将正确的缓冲区传递给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;
}