指针作为一个数组的索引 - C.

时间:2016-09-28 16:27:09

标签: c arrays pointers

我无法使下面的算法在没有索引的情况下工作(索引可以正常工作)。这对我的大学来说是一个小练习,其中一个要求是我只能使用"指针参考"遍历我分配的数组(frase),而不是索引。我已经尝试过最后让它发挥作用的评论,我放弃了,因为我尝试的任何东西都不起作用...感谢您的帮助。

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

int main(){
    char* frase;
    frase = malloc(sizeof(char) * 100);

    gets(frase);

    /*
    while(*frase != '\0'){
        printf("%c", *frase);
        frase++;
    }
    */
    int i = 0;
    while(frase[i]){
        printf("%c", toupper(frase[i]));
        i++;
    }

    printf("\n");
    free(frase);
}

4 个答案:

答案 0 :(得分:3)

问题是你释放了一个已经改变的指针(事实上,frase已经使用frase++递增了) 然后free(frase)不起作用。

答案 1 :(得分:3)

通过使用“仅指针”,您指向一个元素,处理它然后将指针递增以指向下一个元素:

char *pfrase = frase;
while(pfrase){
    printf("%c", toupper(pfrase));
    pfrase++;
}

答案 2 :(得分:1)

传递给free的参数的值必须是malloc函数族之一返回的指针。如果将不同的值传递给free,则程序具有未定义的行为。

使用时:

frase = malloc(sizeof(char) * 100);

gets(frase);

while(*frase != '\0'){
   printf("%c", *frase);
   frase++;
}

free(frase);

您正在使用指针调用free,该指针的值不同于malloc返回的值。这是未定义行为的原因。

解决此问题的一种方法是使用索引访问数组。

解决此问题的另一种方法是使用不同的变量来迭代数组的内容。

frase = malloc(sizeof(char) * 100);

gets(frase);

// Don't modify frase. Use another variable to iterate
char* cp = frase;
while(*cp != '\0'){
   printf("%c", *cp);
   cp++;
}

free(frase);

答案 3 :(得分:-1)

随着每个人的回复,我的算法现在正在运行。现在就是这样:

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

      int main(){

           char* frase;
           frase = malloc(sizeof(char) * 100);

           gets(frase);

           char* pointer = frase;
           while(*pointer){
                printf("%c", toupper(*pointer));
                *pointer++;
                }


           printf("\n");
           free(frase);
           free(pointer);
           }

不要编辑我的“frase”数组和无用的免费问题似乎都解决了。此外,我知道获取问题,但这个算法是一个练习。谢谢大家的帮助!