Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C结构中存储字符串_C_String_Memory Management_Struct - Fatal编程技术网

在C结构中存储字符串

在C结构中存储字符串,c,string,memory-management,struct,C,String,Memory Management,Struct,作为一个计算机科学家庭作业,我被要求做一个在下面使用这个代码的算法。问题是,Name struct中的字符串作为指针存储,因此当我获得下一个输入时,所有字符串都是相同的,这破坏了我完整代码的功能 #包括 #包括 #包括 #定义默认值_第5章 #定义成功1 #定义故障0 #定义最大行数100000 typedef结构名 { 字符*字符串; }姓名; 名称*initializeName(字符*InputName) { Name*Name=calloc(1,sizeof(Name)); if(name

作为一个计算机科学家庭作业,我被要求做一个在下面使用这个代码的算法。问题是,Name struct中的字符串作为指针存储,因此当我获得下一个输入时,所有字符串都是相同的,这破坏了我完整代码的功能

#包括
#包括
#包括
#定义默认值_第5章
#定义成功1
#定义故障0
#定义最大行数100000
typedef结构名
{
字符*字符串;
}姓名;
名称*initializeName(字符*InputName)
{
Name*Name=calloc(1,sizeof(Name));
if(name!=NULL)
{
名称->字符串=输入的名称;
}
返回名称;
}
无效打印名(名称*名称){
printf(“名称->%s\n”,名称->字符串);
}
int main(){
姓名**姓名;
对于(int i=0;i<3;i++){
字符串[100];
scanf(“%s”,字符串);
名称[i]=初始值设定名称(字符串);
对于(int j=0;jstring)是否存储为字符串

name->string = inputedName;
不复制字符串。您需要
strdup

name->string = strdup(imputedName);

在分配了
结构名称之后,可以继续分配空间来存储字符串本身的副本:

if (name != NULL)
{
    /* +1 for null terminator at end of string */
    size_t string_length = strlen(inputedName) + 1;

    name->string = calloc(string_length, 1);
如果成功,则可以将字符串复制到新分配的空间中(如果失败,则需要释放
struct Name
allocated):


main()
Name**Name;
是指针,但它还没有指向任何地方,因此无法访问
Name[i]
。您的
for()
循环只能从
Name[0]
访问
Name[2]
,因此将定义更改为三个
Name*
指针的数组将修复它:

Name *name[3];

不要只复制指针(
name->string=inputedName
);分配新存储并复制字符串内容。@n.m.我无法解决引用问题的问题。虽然它们表面上可能有关联,但我相信它们处理不同的情况。@bigdataolddriver:不是。他上面已经有一个
calloc
两行了。@bigdataolddriver是正确的-他所指的错误在
main
,其中声明了
Name**Name;
,并且
Name[i]
然后在没有内存分配的情况下被访问。哦,是的,在接受@joshua调用
calloc
的解释后,我有一种奇怪的感觉。我一遍又一遍地上下查看,直到@caf指向oute。即使在初始化数组并使用strdup之后,字符串仍然是唯一的same@victormoraesgs:正如caf已经指出的那样这里有一个打字错误
printName(name[i]);
shold读
printName(name[j])
。即使在进行了这些更改之后,名称数组中的字符串仍然是相同的。下面是它是如何发生的:
string1
outputs
Name->string1
|
string2
outputs
Name->string2
@victormoraesgs:更改之后,每个
Name
中的字符串都是不同的,但是您的循环总是打印相同的字符串,因为它在
j
上循环,但打印
name[i]
Name *name[3];