2012-12-11 35 views
2

我想通过一个char *并在另一个函数中进行更改,但不知何故它一直给出seg故障。C通过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

数组索引,[],操作者具有比引用操作优先级低从malloc转换返回,*

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

(*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需要的,你应该有 得到了关于这个的警告。

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,因此可以被省略,并且不需要在C.

+0

这不是问题的答案 – SomeWittyUsername

+0

它实际上工作,所以我想它回答了主要问题。下面的例子后,我搞砸了 – d0pe

+0

@icepack这取决于我猜的问题的解释是怎样的。 OP没有说他正试图学习关于指针的指针,所以我认为解释如何使程序工作,同时简化代码似乎是合理的。 – simonc