所以我有这段代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "hw09-header.h"
struct student
{
char* name;
char* course;
};
int main(int argc, char* argv[])
{
int i = 0, init_size=10,x,z;
char *value = "go";
int key, count=0;
char* del = ","; /*Uses comma sign as delimiter*/
char *token=NULL;
char *temp_stor;
struct student *array;
struct student *temp;
if(argc != 2)
{
printf(" usage: program_name positive_integern");
printf("example: ./example-hw09 123n");
exit(1);
}
/************** begin REQUIRED **************/
/* put before logic. DO NOT PUT IN A LOOP */
key = atoi(argv[1]);
initialize(key);
/************** end REQUIRED **************/
/* example loop */
array=malloc((init_size)*sizeof(int));
while(strcmp(value, "stop") != 0)
{
value = getString();
token = strtok(value, del);
while (token !=NULL)
{
if(i%4==0)
{
init_size=init_size*2;
temp = realloc(array,init_size*sizeof(int)) ;
if(temp != NULL)
{
array = temp;
}
else
{
printf("unable to reallocaten");
exit(1);
}
}
array[i].name=malloc(sizeof(struct student)*10);
strcpy(array[i].name,token);
printf("%s %dn",array[i].name,i);
token = strtok( NULL, del );
array[i].course=malloc(sizeof(struct student)*11);
strcpy(array[i].course,token);
printf("%s n",array[i].course);
i=i+1;
token = strtok( NULL, del );
x=i;
for(x=0; x<i; x++)
{
if(strcmp(array[x].name,token)==0)
printf("Duplicate found n");
}
}
}
}
现在,当我尝试执行strcmp时,它总是给我一个分段错误,我不知道为什么。
我不应该在这里使用链接列表,我想我已经做了所有的事情,在接下来的几个部分,我只需要比较和排序的事情,我不断得到分割错误。
我的数组里有元素,我可以把它们全部打印出来,只是出于某种原因不能进行比较。
最佳答案
部分回答,指出没有意义的事情。你应该试着理解为什么,这样你就可以修复它们。但是,要解释像malloc
这样的东西是如何工作的,这个网站并不正确。
array[i].name=malloc(sizeof(struct student)*10);
strcpy(array[i].name,token);
为10个
student
结构分配空间,然后将字符串复制到其中。这没道理。因为name
是char*
你应该有malloc(<maximum size of string with terminating 0 included>)
。 array=malloc((init_size)*sizeof(int));
后来
array[i].name= .....
您将
array
分配为int数组(由sizeof(int)
指示),但随后您将使用项,就像它们是结构一样。然后建议:每次您有
strcpy(dst, src)
,请将其替换为:snprintf(dst, <how much space is allocated at dst>, "%s", src);
这将避免缓冲区溢出,还将迫使您考虑已为
dst
分配了多少空间(如果您不知道,那么您首先要解决的问题是如何解决和解除隐藏)。关于c - 具有结构数组的strcmp段错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16052777/