[英]how to manipulate a pointer of char array (string) inside a function where it is passed as a parameter in c / c++
[英]How to access elements of char array passed as a parameter to a function in c?
我有这个函数,它接收到一个指向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);
但是当我运行main()
时出现EXC_BAD_ACCESS (code=1, address=0x0)
错误。 错误发生在该行的for循环的第二次迭代中: *(s[i]) = 'a';
据我了解,我没有正确访问元素,正确的方法是什么?
s
被声明为指向指针的指针。 实际上,它是一个指向数组开头的指针,但是不能仅从类型系统中推断出来。 它也可以是指向指针数组开始的指针,这就是s[i]
对待它的方式。 您需要首先取消引用s
(以获取指向数组起点的指针),然后对其进行索引:
(*s)[i] = 'a';
另外,正如@MFisherKDX在注释中正确指出的那样,如果要将*s
传递给printf
或任何其他标准的字符串操作函数,则必须通过以0字符终止将其转换为正确的C字符串。
这更清楚地显示了您应该做什么,同时又保持原始代码的位置:
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)
始终为1,在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);
}
代替分配
*(s[i]) = 'a';
用这个:
(*s)[i] = 'a';
但是请不要忘记C / C ++字符串以null结尾
或者,您可以使用这种方法来获得更具可读性的代码:
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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.