理解在C中使用const缓冲区和read()

时间:2014-02-04 00:55:18

标签: c buffer const

我的印象是C中的const值无法更改。然而,我写了这个人为的例子,至少对我而言似乎改变了常数的价值。这是代码:

#include <stdio.h>
#include <unistd.h>

void test(const char* buffer, int num);

int main(){
    const char buffer[10];
    test(buffer, 1);
    printf("main 1: %s\n", buffer);
    test(buffer, 2);
    printf("main 2: %s\n", buffer);

    return 0;
}

void test(const char* buffer, int num) {
    read(0, (void *)buffer, 10);
    printf("test %da: %s", num, buffer);
    buffer = "num";
    printf("test %db: %s\n", num, buffer);
}

这是输出:

me@computer:~/C$ ./a.out 
123
test 1a: 123
test 1b: num
main 1: 123

456
test 2a: 456
test 2b: num
main 2: 456
  1. 每次调用const buffer后,main中的test()的值都会更改。为什么呢?

  2. test()中,我可以在方法范围中将buffer的值更改为"num",我认为这是不可能的......?

  3. 当我在"num"时将缓冲区的值更改为test()时,该更改不会反映在main()中,因为传递值有意义。但是,buffer中的main()确实发生了变化。输入到"num"的调用中的值存储在read()中,而不是buffer。首先,为什么值"num"不是因为那行代码在read()之后?其次,为什么buffer中的main()发生了变化?
  4. 修改 的: 我刚想到一个想法:如果类型转换可以取消const修饰符,那么使用const参数的意义何在?我认为这是为了保证传递给函数的值不会被改变。这种解决方法似乎打败了它的整个目的......

1 个答案:

答案 0 :(得分:2)

  1. 因为您已使用类型转换删除const

  2. 您正在将指针的值更改为"num"的地址。你没有制作指针const,只是指向它。因此,您可以将指针本身更改为指向其他位置。要使指针本身const,请尝试const char * const buffer

  3. 请参阅2.您刚刚更改了本地参数buffer指向的位置。这不会改变主要的局部变量buffer指向的地方。