Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.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-获取char*的内容副本?_C_Pointers - Fatal编程技术网

C-获取char*的内容副本?

C-获取char*的内容副本?,c,pointers,C,Pointers,如何获取exampleString的内容并将其存储在exampleStruct[I].name中?当我现在直接设置它时,它将所有exampleStructs的值设置为循环最后一次迭代时的值 我知道它必须处理某种类型的指针,但我不确定如何处理这一点。问题似乎是aString对于循环的每次迭代都是相同的内存位置,因此所有项exampleStruct[I].name都指向同一个位置,这就得到了迭代循环的最后一个值 您需要使用不同的内存位置来存储每次迭代的每个结果字符串 有几种方法可以解决这种情况 您可

如何获取exampleString的内容并将其存储在exampleStruct[I].name中?当我现在直接设置它时,它将所有exampleStructs的值设置为循环最后一次迭代时的值


我知道它必须处理某种类型的指针,但我不确定如何处理这一点。

问题似乎是aString对于循环的每次迭代都是相同的内存位置,因此所有项exampleStruct[I].name都指向同一个位置,这就得到了迭代循环的最后一个值

您需要使用不同的内存位置来存储每次迭代的每个结果字符串

有几种方法可以解决这种情况

您可以使用strdup,它将在新的malloc-ed内存位置复制结果字符串。这不是这里描述的标准C函数。 此外,您还必须记住在使用完后释放此内存

[还有一个strdupa函数,但它的可移植性不如本问题中所述的strdup]

如果已经为结果字符串保留了内存位置,则可以使用strcpy。这是ANSI C标准

您也可以在使用memcpy复制字符串之前自己调用malloc,如下所示

struct Example {
    char* name;
};

struct Example exampleStruct[5];

int i;
for (i = 0; i < 5; i++) {
    //Pretend aString is a different random string each loop
    char* exampleString = strtok(aString, " ");
    exampleStruct[i].name = exampleString;
}
记住,您有这些函数的安全版本:strncpy和strndup。

关于:

struct Example {
    char* name;
};

struct Example exampleStruct[5];

int i;
for (i = 0; i < 5; i++) {
    //Pretend aString is a different random string each loop
    char* exampleString = strtok(aString, " ");
    size_t slen = strlen(exampleString) + 1; /* the +1 is to include the copy of the NULL character */
    char* tstr = malloc(slen);
    memcpy(tstr, exampleString, slen); 
    exampleStruct[i].name = tstr;
}

你需要strcpy。将字符串指定给char*不会复制内容。这样做时会出现segfault错误:strcpyexampleStruct[I]。名称,ExampleString向strdup问好。strdup为我工作,谢谢!请注意,strdup不是由C标准定义的,因此它可能并不总是可用的。它是由POSIX定义的。这里的memcpy不会复制终止的空字符。还要注意strlen返回一个size\u t值,memcpy的第三个参数也应该是size\u t值,而不是int。@PaulGriffiths,这就是tstr[slen+1]=0的原因;电话线在那里。。。要使用空字符正确终止字符串。tstr[slen+1]=0是一种越界数组访问,会导致未定义的行为。为什么不在memcpy调用中复制\0?@Marcos-这是一个越界访问,因为您为slen+1值分配了空间,但尝试使用tstr[slen+1]进行访问。您可以使用的最大索引是slen,因为C使用基于零的索引tstr[slen+1]相当于C中的*tstr+slen+1。更改为使用memcpy复制\0已修复该问题;您的新解决方案更清晰,更容易获得正确的答案!
exampleStruct[i].name = strdup(exampleString);