使用双指针时的奇怪行为

时间:2015-05-08 16:55:03

标签: c arrays pointers

我需要帮助才能理解为什么在这个小程序中我无法正确操作指针:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
          void change(char *s[][15]){
              int i=0;
              while(i<5){
                  if(s[i][0]=='B') s[i][0]='v';
                  i++;
              }
          }
    /*My code is supposed to allocate dynamically 5 arrays of 15 chars each
    (like tab[5][15])and then put a message on them and try to modify the messages.
In this particular case i'm trying to change the first letter of each string to 'V'.
    I'm doing this little experience because of another program 
    in which i have difficulties accessing double arrays*/    
    int main(){
            int i;
            char **s;
            s =malloc(5*sizeof(char*));
            for(i=0;i<5;i++){
                s[i]=malloc(15*sizeof(char));
                sprintf(s[i],"Bonjour%d",i);
            }
            change(s);
            for(i=0;i<5;i++){
                printf("%s\n",s[i]);
            }
            return 0;
    }

我在期待:

Vonjour0
Vonjour1
Vonjour2
Vonjour3
Vonjour4

但我明白了:

Bonjour0
Bonjour1
Bonjour2
Bonjour3
Bonjour4

我正在为另一个程序测试这个小代码,但我不知道为什么数组不会改变。 在我的其他程序中,我无法访问双指针或打印内容。 所以我的问题是:为什么在这个程序中我无法修改数组的内容?

3 个答案:

答案 0 :(得分:2)

您的更改方法需要使用&#34; char ** s&#34;而不是char * s [] [15]。这是因为您的方法期望指向多维数组的指针。这是不可变的,因为字符串的原始数据类型是指向字符串数组的指针(IE:字符数组)。

希望这很清楚。

答案 1 :(得分:1)

应该是

char **change(char **s){
              int i=0;
              while(i<5){
                  if(s[i][0]=='B') s[i][0]='v';
                  i++;
              }
              return s;
          }

答案 2 :(得分:0)

您只需将函数参数更改为char *s[]

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void change(char *s[]){
    int i=0;
    while(i<5){
        if(s[i][0]=='B') s[i][0]='v';
        i++;
    }
}

int main(){
    int i;
    char **s;
    s =malloc(5*sizeof(char*));
    for(i=0;i<5;i++){
        s[i]=malloc(15*sizeof(char));
        sprintf(s[i],"Bonjour%d",i);
    }
    change(s);
    for(i=0;i<5;i++){
        printf("%s\n",s[i]);
    }
    return 0;
}

节目输出:

vonjour0
vonjour1
vonjour2
vonjour3
vonjour4