char指针 - 如何调试此代码?

时间:2017-01-11 11:15:58

标签: c variables pointers char

#include <stdio.h>

int main(){

    char *p, *initial;
    int c, in=0;

    for(initial=p; (c = getchar()) != EOF; p++, in++)
        *p = c;

    for(int i=0; i<in; i++)
        printf("%p = %c\n", initial, *initial++);
}

对于像hello hai这样的输入,程序会提供不完整的输出:

0028FF29 = h
0028FF2A = e
0028FF2B = l
0028FF2C = l
0028FF2D =  
0028FF2E =  
0028FF2F =  
0028FF30 =  
0028FF31 =

它适用于小文本,但它不适用于大文本。

1 个答案:

答案 0 :(得分:3)

未定义的行为。您没有将p设置为指向任何有效的内存位置。所以*p = c没有明确定义的程序。

您可以让p指向固定大小的缓冲区(如果您知道输入将永远不会超过一定数量的字符):

char buff[MAX_SIZE];
char *p = buff;

或者使用动态内存分配:

char *p = malloc(INITIAL_SIZE);
size_t current_size = INITIAL_SIZE;
// Later
if (p - initial == current_size) {
  char *buff_new = realloc(initial, current_size * 2);
  if (buff_new) {
    initial = buff_new;
    p = initial + current_size;
    current_size *= 2;
  }
  else
    // should probably abort here, the program is out of memory. Bad bad bad.
}