静态数组和动态数组

时间:2012-05-07 15:59:28

标签: c arrays pointers

char a[10];
scanf("%s",a);
int i=0;
while(a[i]!='\0')
     printf("\n%c",a[i++]);  //similar to printf("%s",a);               


char *b;
b=malloc(10*sizeof(char));
scanf("%s",b);
i=0;
while((b+i)!='\0')
     printf("\n%c",*(b+i++));   //not similar to printf("%s",a);

对于输入“abcd”,第一个循环打印a []是否与printf()。但对于* b,情况并非如此。

第二个循环继续太多,直到遇到'\ 0'。

那么,这是否意味着'\ 0'会自动附加在字符串的末尾,而不会附加在char类型指针的末尾?

它的工作是追加这个'\ 0'?编译器的?

2 个答案:

答案 0 :(得分:7)

您忘记取消引用b+i获得的指针。它应该是:

while (*(b + i) != '\0') // or while (b[i] != '\0') or while(b[i])

b + i只是获取一个地址,你必须取消引用它才能真正查看内存指向的内容并查看它是否是NUL终止符。 x[y]表示法等同于*(x + y)

另外,请不要忘记使用free分配的malloc内存。

答案 1 :(得分:1)

解除引用问题。

在行(b + i)中应替换为:

*(b+i)

b[i]

此外,如果您只是接受字符串,则应考虑使用fgets()而不是scanf,因为它可以帮助您避免用户输入太多字符并使程序崩溃。

最后,您可以考虑使用calloc()而不是malloc(),因为它会自动将您分配的数组的内容设置为全零而不是随机垃圾。

举个例子:

#include <stdio.h>
#define MAX_BUFFER_LENGTH
int main(void) {
  char a[MAX_BUFFER_LENGTH];
  char *b;
  fgets(a,MAX_BUFFER_LENGTH,stdin);
  int i=0;
  while(a[i]!='\0') {
     printf("\n%c",a[i++]);
  }

  b=calloc(MAX_BUFFER_LENGTH,sizeof(char));
  fgets(b,MAX_BUFFER_LENGTH,stdin);
  i=0;
  while(*(b+i)!='\0') {
    printf("\n%c",*(b+i++));
  }
  // Done
  return 0;
}

这是解决您正在解决的问题的一种更安全的方式。

祝你好运!