指针数组*(*(string + i)+ j)。 (这可能吗?)

时间:2013-10-30 07:18:47

标签: c arrays pointers

在这段代码中,我试图使用函数来反转一个字符串。我使用了一个指针数组来存储一些数组。*(*(string+i)+j)这一行适用于i=0ii=1 1}}递增到#include<stdio.h> #include<string.h> char**reverse(char**); int main() { char *final[2],*s[] = { "To err is human...", "But to really mess things up...", "One needs to know C!!" } ; int i; for(i=0;i<=2;i++) puts(s[i]); reverse(s); for(i=0;i<=2;i++) puts(final[i]); return 0; } char** reverse(char*string[2]) { char *temp[2]; int len,i,j,k; for(i=0;i<=2;i++) { len=strlen(string[i]); k=0; for(j=len-1;j>=0;j--) { *(*(temp+i)+k)=*(*(string+i)+j); /*this line work for i=0 but give segmentation fault for i=1;*/ printf("%c",*(*(temp+i)+k)); k++; } printf("\n"); } return temp; } 它会产生分段错误。我无法理解可能出现的问题。

{{1}}

4 个答案:

答案 0 :(得分:3)

这里有很多问题:

  1. temp中的指针未初始化,temp是本地堆栈数组。您无法退货,因为它将超出范围

  2. 您没有对“reverse”

  3. 的返回值做任何事情
  4. 您的初始数组大小为3,而不是大小2.

  5. 无需使用令人困惑的(*(string + i)+ j)表示法。 string [i] [j]也可以正常工作,并且更具可读性。

  6. 反转后,您不会终止字符串。你需要temp [i] [k] ='\ 0';在for循环之后执行此操作。

  7. 对代码进行最简单的重新处理以获得所需的结果可能是这样的。

    #include<stdio.h>
    #include<string.h>
    #include<malloc.h>
    
    char**reverse(char**);
    
    int main()
    {
        char **final,*s[] = {
        "To err is human...",
        "But to really mess things up...",
        "One needs to know C!!"
        } ;
        int i;
        for(i=0;i<=2;i++)
        puts(s[i]);
        final = reverse(s);
        for(i=0;i<=2;i++)
        puts(final[i]);
        return 0;
    }
    
    char**reverse(char*string[3])
    {
        char **temp = malloc(sizeof(char*) * 2);
        int len,i,j,k;
    
        for (int i=0; i < 3; i++)
        {
            temp[i] = malloc(sizeof(char) * 512);
        }
    
        for(i=0;i<=2;i++)   
        {
            len=strlen(string[i]);
            k=0;
            for(j=len-1;j>=0;j--)
            {   
                *(*(temp+i)+k)=*(*(string+i)+j);
                printf("%c",*(*(temp+i)+k));
                k++;
            }
            temp[i][k]='\0';
            printf("\n");
        }
        return temp;
    }
    

    节目输出是:

      

    错误是人......

         

    但真的搞砸了......

         

    需要知道C !!

         

    ... namuh si rre oT

         

    ... pu sgniht ssem yllaer ot tuB

         

    !! C wonk ot sdeen enO

答案 1 :(得分:1)

声明了您的变量char *temp[2];但从未分配任何内存(使用malloc等)。因此它指向未定义的内存位置。我认为这会导致您的细分错误。

它适用于i = 0可能是运气:o I.e. temp [0]包含一个char *,它可以指向有效的内存,但temp [1]可能不会(seg fault)。您需要在使用之前分配内存。

temp[i] = malloc(strlen(string[i]));

或者像这样......

答案 2 :(得分:0)

final的类型为“char * final [2]”,但你的循环是

for(i=0;i<=2;i++)
    puts(final[i]);

给了我3个。

答案 3 :(得分:0)

我已经修改了你的代码,如下所示,我运行了代码并且它有效!我希望这对你有所帮助。

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

void reverse(char**);

int main()
{
    char *s[] = {
      "To err is human...",
      "But to really mess things up...",
      "One needs to know C!!"
      } ;
    int i;

    for(i=0;i<=2;i++)
        puts(s[i]);
    //reverse the string!
    reverse(s);
    for(i=0;i<=2;i++)
        puts(s[i]);

    return 0;
}

//function to reverse the string
void reverse(char*string[2])
{   
    char *temp;
    int len,i,j,k;
    for(i=0;i<=2;i++)
    {
        len=strlen(string[i]);
        k=0;
        temp = (char *)malloc((len * sizeof(char)) + 1);
        for(j=len-1;j>=0;j--)
        {   
            temp[k] = string[i][j];
            printf("%c",temp[k]);
            k++;
        }
        temp[k] = '\0';
        //puts(temp[i]);
        string[i] = temp;  // after reversing the string store it back to string!
        printf("\n");

    }
}