2

我正在尝试传递一个 char* 并在另一个函数中更改它,但不知何故它不断给出段错误。

完整代码是:

#include <stdio.h>

void getString(char** str) {
    *str[0] = '$';
    char c;
    int i = 1;
    while ((c = getchar()) != '$') {
        if (c != '\n') {
            *str[i-1] = c;
            i++;
        }
    }
    *str[i] = '\0';
}

int main (int argc, char *argv[]) {

    char* str =  (char*)malloc(200 * sizeof(char));
    while (1) {
        getString(&str);
        printf("String: %s\n",str);
    }
    return 0;
}

如果我从 str[0] = '$' 中获取 *,它会发出警告,将指针传递给整数。

不知道我在哪里搞砸了。

4

2 回答 2

4

数组索引 [] 运算符的优先级低于取消引用运算符 *

所以你必须改变你的代码来做

 (*str)[0] = '$';
 (*str)[i-1] = c;
 (*str)[i] = '\0';

在您的情况下,您不需要传递指针的地址,只需传递指针:

getString(str);

并以

str[0] = '$';  
str[i-1] = c;
str[i] = '\0';

由于您使用的是 malloc(),因此请务必添加#include <stdlib.h> 如果您没有强制转换 malloc 的返回值,这在 C 中是不需要的,您应该收到关于此的警告。

于 2012-12-11T13:13:42.183 回答
0

您想更改现有缓冲区的内容,而不是创建然后返回一个新缓冲区,以便您可以直接传递char*getString

#include <stdio.h>

void getString(char* str) {
    str[0] = '$';
    char c;
    int i = 1;
    while ((c = getchar()) != '$') {
        if (c != '\n') {
            str[i-1] = c;
            i++;
        }
    }
    str[i] = '\0';
}

int main (int argc, char *argv[]) {

    char* str =  malloc(200);
    while (1) {
        getString(str);
        printf("String: %s\n",str);
    }
    return 0;
}

请注意,我还对您的内存分配进行了一些更改。 sizeof(char)保证为 1,因此可以省略,并且您不需要从mallocC中转换返回值。

于 2012-12-11T13:12:15.727 回答