我试图使用一个函数来分配空间并填充该空间(或至少其中一些)与字符形成字符串。在函数中,我调用malloc,并在同一函数中,我将字符分配给给定的空间。下面的代码给出了我所做操作的一般要点:
#define INITIAL 10
int func(char **s);
int
main(int argc, char **argv) {
char *s;
int n;
n = func(&s);
printf("Donen");
return 0;
}
int
func(char **s) {
int i;
*s = (char*)malloc(INITIAL*sizeof(char));
assert(*s);
for (i=0; i<5; i++) {
printf("i=%dn", i);
*s[i] = 'a'; /*'a' is an arbitrary char for this example */
}
return i;
}
该代码的输出是:
i=0
i=1
i=2
Segmentation fault: 11
我让函数返回int的原因是我最终希望函数返回我所形成的字符串的长度。
我完全不确定为什么我得到分割错误;似乎我已经分配了足够的空间来容纳下一个字符。我也觉得很奇怪,它在i=2时停止了。如果有人能指出我所犯的错误,我将不胜感激!
代替
*s[i] = 'a';
你想要的(*s)[i] = 'a';
*s[i]
等价于*(s[i])
。也就是说,它将s视为字符串数组,并给出索引为i的字符串的第一个字符。
*s[i]
首先计算s[i]
, i!=0
将不是有效的位置,然后取消引用并尝试将'a'
放在那里。可能导致分段故障。
尝试将*s[i]
更改为(*s)[i]
后缀[]
具有比一元*
更高的优先级,因此*s[i]
被解析为*(s[i])
,这不是您想要的;您希望解引用s
并将其索引到结果中,因此需要显式地将*
操作符与s
: (*s)[i]
分组。
您可能希望使用size_t
而不是int。如果需要函数返回负值,则使用ssize_t
:
#include <stdio.h>
#include <stdlib.h>
#define INITIAL 10
ssize_t func(char **);
int main(void)
{
char *s;
if((func(&s)) == -1)
{
printf("An error occurredn");
return 1;
}
printf("Donen");
free(s);
return 0;
}
ssize_t func(char **s)
{
size_t i = 0;
if ( INITIAL < 1 )
return -1;
if (!(*s = malloc(INITIAL*sizeof(char))))
return -1;
for (i=0; i< 5; i++) {
printf("i=%zun", i);
(*s)[i] = 'a';; /*'a' is an arbitrary char for this example */
}
return i;
}