我对指针有疑问。我正在尝试将数组“名称”的内容复制到数组“ self.names”。 在循环中,当我打印指针的值时,指针指向第一个元素,但是当我将其作为参数传递给strcpy时,它指向第三个元素。 我在做什么错了?
Argument.h:
#ifndef ARGUMENT_H
#define ARGUMENT_H
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct Argument{
char **names;
};
struct Argument Argument_new(char**);
#endif
Argument.c:
#include "argument.h"
struct Argument Argument_new(char **names){
struct Argument self;
size_t namesc=0;
char **names_start=names;
while(*names++){
namesc++;
}
self.names=malloc(namesc*8);
for(names=names_start;*names;names++){
printf("%s\n",*names);
*self.names=malloc(sizeof(*names));
strcpy(*self.names,*names);
}
names=names_start;
printf("%s\n%s\n",self.names[0],names[0]);
printf("%s\n%s\n",self.names[1],names[1]);
}
main.c:
#include "argparse/argparse.h"
int main(int argc, const char **argv){
char *a[]={"abc","def","ghi",NULL};
Argument_new(a);
return 0;
}
答案 0 :(得分:0)
在循环的每次迭代中,您都将当前字符串复制到列表中的第一个元素*self.names
,即self.names[0]
。因此,当您打印self.names[0]
时,只有您复制的最后一个内容出现在此处,即names
列表中的最后一个字符串。
您需要跟踪您使用的名称,然后将其复制到相关的数组成员中。
此外,sizeof(*names)
给出char *
的大小,而不是它包含的字符串的长度。为此,您需要strlen
,并确保在末尾为空字节添加1。同样,分配列表时,请勿使用幻数8,而应使用sizeof(*names)
:
int i;
self.names=malloc(namesc*sizeof(*names));
for(i=0,names=names_start;*names;names++,i++){
printf("%s\n",*names);
self.names[i]=malloc(strlen(*names) + 1);
strcpy(self.names[i],*names);
}