C 循环仅在指针赋值时执行一次

C 循环仅在指针赋值时执行一次,c,C,我有一个简单的代码来反转字符串: char* reverse(char* s){ int i,j,len=strlen(s); char* r; for(i=len-1,j=0;i>=0;i--,j++){ printf("%d:%c\n",j,s[i]); r[j]=s[i]; } 假设输入字符串为“abc”,则输出“不”行r[j]=s[i]内部循环是: 0:c 1:b 2:a 如果我包括r[j]=s[I]赋值,输出将停止 0:c 为什么分配会在这里停止

我有一个简单的代码来反转字符串:

char* reverse(char* s){    
int i,j,len=strlen(s);
char* r;


for(i=len-1,j=0;i>=0;i--,j++){
    printf("%d:%c\n",j,s[i]);
    r[j]=s[i];
}
假设输入字符串为“abc”,则输出“不”行
r[j]=s[i]内部循环是:

0:c
1:b
2:a
如果我包括
r[j]=s[I]
赋值,输出将停止

0:c

为什么分配会在这里停止循环

首先,您正在写入未初始化的指针:char*r已声明,但从未分配。动态或在堆栈上分配内存,然后写入。 例如:

char* r = malloc(len + 1);

现在,当您试图访问未初始化的内存时,您的代码很可能会崩溃。

首先,您正在写入未初始化的指针:char*r已声明,但从未分配。动态或在堆栈上分配内存,然后写入。 例如:

char* r = malloc(len + 1);

现在,当您试图访问未初始化的内存时,您的代码很可能会崩溃。

有一些事情会导致问题

j被指定为零,并与for循环中的零进行比较,for循环将立即满足循环的条件并退出

还请注意,由于数组包含0作为第一个元素,因此字符串长度将报告为比实际大小小1,因此大小始终比数组中的大小小1

我建议将j从for循环赋值中拉出来,并在循环体中增加它。这将更容易调试,您可以监视它的值并逐步完成代码

// an example of how to assign the input value for a
// function accepting an array of characters instead of a pointer
char s[] ="hellodude";

// start of the function which accepts an array of char
// (may need adjusting to return a buffer and pointer
// etc. you can determine that)
char* reverse(char s[]){
    // note the following changes to fix the iterating problems...
    int i,j=0,len=strlen(s)+1;
    char r[len];

    for(i=len-1,i>=0;i--;){
        j++;
        printf("%d:%c\n",j,s[i]);
        r[j]=s[i];
    }
return r;
}

希望这能为您指明正确的方向。

有些事情会导致问题

j被指定为零,并与for循环中的零进行比较,for循环将立即满足循环的条件并退出

还请注意,由于数组包含0作为第一个元素,因此字符串长度将报告为比实际大小小1,因此大小始终比数组中的大小小1

我建议将j从for循环赋值中拉出来,并在循环体中增加它。这将更容易调试,您可以监视它的值并逐步完成代码

// an example of how to assign the input value for a
// function accepting an array of characters instead of a pointer
char s[] ="hellodude";

// start of the function which accepts an array of char
// (may need adjusting to return a buffer and pointer
// etc. you can determine that)
char* reverse(char s[]){
    // note the following changes to fix the iterating problems...
    int i,j=0,len=strlen(s)+1;
    char r[len];

    for(i=len-1,i>=0;i--;){
        j++;
        printf("%d:%c\n",j,s[i]);
        r[j]=s[i];
    }
return r;
}

希望这能为您指明正确的方向。

运行调试器。或者想想看。
char*r你认为
r
指向哪里?运行调试器。或者想想看。
char*r你认为
r
指向哪里?正如我所说的,分配内存。如果你被限制为c,那么做char*r=(char*)malloc(len+1);完成后别忘了释放它。正如我说的,分配内存。如果你被限制为c,那么做char*r=(char*)malloc(len+1);完成后别忘了释放它。