我有这个函数接收一个指向char数组的指针并将其初始化为len
重复的" a":
void test(char ** s, int len) {
*s = (char *)malloc(sizeof(char) * len);
int i;
for(i = 0; i < len; i++) {
*(s[i]) = 'a';
}
printf("%s\n", *s);
}
main()
中的我有这段代码:
char * s;
test(&s, 3);
但是当我运行EXC_BAD_ACCESS (code=1, address=0x0)
时出现main()
错误。在此行的for循环的第二次迭代中发生错误:*(s[i]) = 'a';
据我所知,我没有正确访问这些元素,这是正确的方法吗?
答案 0 :(得分:3)
s
被声明为指针的指针。实际上,它是指向数组开头的指针的指针,但这不能仅从类型系统中推断出来。它也可以是一个指针数组开头的指针,这就是s[i]
对待它的方式。你需要首先解除s
(获取指向数组开始的指针),然后对其进行索引:
(*s)[i] = 'a';
另外,正如@MFisherKDX在评论中正确指出的那样,如果你要将*s
传递给printf
或任何其他标准字符串操作函数,你必须变成一个正确的C字符串,以0字符结尾。
答案 1 :(得分:3)
这更清楚地显示了您应该做什么,同时保持接近原始代码:
void test(char ** s, int len) {
char *p = malloc(len);
int i;
for(i = 0; i < len; i++) {
p[i] = 'a';
}
printf("%s\n", p);
*s = p;
}
请注意,根据定义,sizeof(char)
始终是一个,而在C中则无需转换malloc()
的结果。
该代码还包含所有原始问题,因为它实际上并未创建可以发送到printf( "%s... )
的字符串。这解决了这个问题:
void test(char ** s, int len) {
char *p = malloc(len+1);
int i;
for(i = 0; i < len; i++) {
p[i] = 'a';
}
p[i]='\0';
printf("%s\n", p);
*s = p;
}
这更容易,不需要使用双重*
指针:
char *test(int len) {
char *p = malloc(len+1);
int i;
for(i = 0; i < len; i++) {
p[i] = 'a';
}
p[i]='\0';
printf("%s\n", p);
return(p);
}
答案 2 :(得分:1)
而不是作业
*(s[i]) = 'a';
使用它:
(*s)[i] = 'a';
但不要忘记C / C ++字符串是null terminated
或者您可以使用此方法获得更易读的代码:
void test(char** s, int len) {
// 1 char extra for zero
char *str = (char*)malloc(sizeof(char) * (len+1));
int i;
for(i = 0; i < len; i++)
str[i] = 'a';
// zero terminated string
str[len] = 0;
printf("%s\n", str);
*s = str;
}