我正在回顾C中的指针,并为自己创建了一些练习练习。我认为通过一组struct指针读取一些结构,然后显示和排序数组会很好。我觉得我遇到的问题是相当基本的问题。下面的代码读入第一个条目,但firstName字符串始终为null。在打印完第一个结构并继续第二个结构后,它就会“繁荣”。在读取firstName字符串时。我以为我在initParty()中正确初始化了char字符串,所以我不确定这里的问题是什么。有任何想法吗?
示例运行:
*(gdb)运行 启动程序:/ home / remnux / C / struct 输入名字:john 输入姓氏:smith 输入ssn:1234 (null)史密斯,1234
编程接收信号SIGSEGV,分段故障。 在struct.c:51的getParty(p = 0x0)中的0x00000000004009a4 51 scanf("%s",p-> firstName); (gdb)*
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
struct person{
char *firstName;
char *lastName;
int ssn;
};
void print(struct person* p){
printf("\n%s ", p->firstName);
printf("%s, ", p->lastName);
printf("%d\n ", p->ssn);
}
bool isGreaterThan(struct person *p1, struct person *p2){
return (strcmp(p1->firstName > p2->firstName) > 0)
|| ((strcmp(p1->firstName > p2->firstName) == 0) && (strcmp(p1->lastName > p2->lastName) > 0))
|| ((strcmp(p1->firstName > p2->firstName) == 0) && (strcmp(p1->lastName > p2->lastName) == 0)) && (p1->ssn - p2->ssn > 0);
}
void printArray(struct person** parray, int size){
int i;
for(i = 0; i < size; i++)
printf("%s %s, %d", parray[i]->firstName, parray[i]->lastName, parray[i]->ssn);
}
void sort(struct person** parray, int size){
int i, j;
for(i = 0; i < size; i++)
for(j = 0; j < size-1; j++){
if(isGreaterThan(parray[j], parray[j+1])){
struct person *temp = parray[j];
parray[j] = parray[j+1];
parray[j+1] = temp;
}
}
return;
}
void initParty(struct person *p){
p = (struct person*)malloc(sizeof(struct person));
p->firstName = (char*)malloc(100 * sizeof(char));
p->lastName = (char*)malloc(100 * sizeof(char));
}
void getParty(struct person *p){
int ch;
printf("\nEnter the firstname: ");
scanf("%s", p->firstName);
while((ch = getchar()) != '\n' && ch != EOF);
printf("\nEnter the lastname: ");
scanf("%s", p->lastName);
while((ch = getchar()) != '\n' && ch != EOF);
printf("\nEnter the ssn: ");
scanf("%d", &(p->ssn));
while((ch = getchar()) != '\n' && ch != EOF);
}
int main(){
int i, ch, size = 2;
// printf("Input the number of people you wish to enter: ");
// scanf("%d", &size);
// while((ch = getchar()) != '\n' && ch != EOF);
struct person *parray[size];
for(i = 0; i < size; i++){
initParty(parray[i]);
getParty(parray[i]);
print(parray[i]);
}
sort(parray, size);
printArray(parray, size);
}
编辑,在使用-Wall编译时消除警告:
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
struct person{
char *firstName;
char *lastName;
int ssn;
};
void print(struct person* p){
printf("\n%s ", p->firstName);
printf("%s, ", p->lastName);
printf("%d\n ", p->ssn);
}
/*bool isGreaterThan(struct person *p1, struct person *p2){
return ((strcmp(p1->firstName > p2->firstName) > 0)
|| ((strcmp(p1->firstName > p2->firstName) == 0) && (strcmp(p1->lastName > p2->lastName) > 0))
|| ((strcmp(p1->firstName > p2->firstName) == 0) && (strcmp(p1->lastName > p2->lastName) == 0) && (p1->ssn - p2->ssn > 0)));
}*/
void printArray(struct person** parray, int size){
int i;
for(i = 0; i < size; i++)
printf("%s %s, %d", parray[i]->firstName, parray[i]->lastName, parray[i]->ssn);
}
/*void sort(struct person** parray, int size){
int i, j;
for(i = 0; i < size; i++)
for(j = 0; j < size-1; j++){
if(isGreaterThan(parray[j], parray[j+1])){
struct person *temp = parray[j];
parray[j] = parray[j+1];
parray[j+1] = temp;
}
}
return;
} */
void initParty(struct person *p){
p = (struct person*)malloc(sizeof(struct person));
p->firstName = (char*)malloc(100 * sizeof(char));
p->lastName = (char*)malloc(100 * sizeof(char));
}
void getParty(struct person *p){
int ch;
printf("\nEnter the firstname: ");
scanf("%s", p->firstName);
while((ch = getchar()) != '\n' && ch != EOF);
printf("\nEnter the lastname: ");
scanf("%s", p->lastName);
while((ch = getchar()) != '\n' && ch != EOF);
printf("\nEnter the ssn: ");
scanf("%d", &(p->ssn));
while((ch = getchar()) != '\n' && ch != EOF);
}
int main(){
int i, size = 2;
// printf("Input the number of people you wish to enter: ");
// scanf("%d", &size);
// while((ch = getchar()) != '\n' && ch != EOF);
struct person *parray[size];
for(i = 0; i < size; i++){
initParty(parray[i]);
getParty(parray[i]);
print(parray[i]);
}
//sort(parray, size);
printArray(parray, size);
return 0;
}
return;
} */
void initParty(struct person *p){
p = (struct person*)malloc(sizeof(struct person));
p->firstName = (char*)malloc(100 * sizeof(char));
p->lastName = (char*)malloc(100 * sizeof(char));
}
void getParty(struct person *p){
int ch;
printf("\nEnter the firstname: ");
scanf("%s", p->firstName);
while((ch = getchar()) != '\n' && ch != EOF);
printf("\nEnter the lastname: ");
scanf("%s", p->lastName);
while((ch = getchar()) != '\n' && ch != EOF);
printf("\nEnter the ssn: ");
scanf("%d", &(p->ssn));
while((ch = getchar()) != '\n' && ch != EOF);
}
int main(){
int i, size = 2;
// printf("Input the number of people you wish to enter: ");
// scanf("%d", &size);
// while((ch = getchar()) != '\n' && ch != EOF);
struct person *parray[size];
for(i = 0; i < size; i++){
initParty(parray[i]);
getParty(parray[i]);
print(parray[i]);
}
//sort(parray, size);
printArray(parray, size);
return 0;
}
return;
} */
void initParty(struct person *p){
p = (struct person*)malloc(sizeof(struct person));
p->firstName = (char*)malloc(100 * sizeof(char));
p->lastName = (char*)malloc(100 * sizeof(char));
}
void getParty(struct person *p){
int ch;
printf("\nEnter the firstname: ");
scanf("%s", p->firstName);
while((ch = getchar()) != '\n' && ch != EOF);
printf("\nEnter the lastname: ");
scanf("%s", p->lastName);
while((ch = getchar()) != '\n' && ch != EOF);
printf("\nEnter the ssn: ");
scanf("%d", &(p->ssn));
while((ch = getchar()) != '\n' && ch != EOF);
}
int main(){
int i, size = 2;
// printf("Input the number of people you wish to enter: ");
// scanf("%d", &size);
// while((ch = getchar()) != '\n' && ch != EOF);
struct person *parray[size];
for(i = 0; i < size; i++){
initParty(parray[i]);
getParty(parray[i]);
print(parray[i]);
}
//sort(parray, size);
printArray(parray, size);
return 0;
}
答案 0 :(得分:0)
由于贡献都是评论而不是答案,我想我会自己回答这个问题。问题是我将指向结构的指针传递给函数,因此结构正在修改本地指针副本,因为C是按值传递的。如果希望修改指向的对象,则必须引用指针,以便在函数内部引用时可以修改主对象。以下更改起了作用:
void initParty(struct person **p){
*p = (struct person*)malloc(sizeof(struct person));
(*p)->firstName = (char*)malloc(100 * sizeof(char));
(*p)->lastName = (char*)malloc(100 * sizeof(char));
}
电话:
initParty(&(parray[i]));