C语言 在函数内部使用malloc形成字符串时出现分段错误(11)



我试图使用一个函数来分配空间并填充该空间(或至少其中一些)与字符形成字符串。在函数中,我调用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;
}

相关内容

  • 没有找到相关文章

最新更新