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