是否可以确定字符串是否为“只读”?

时间:2013-11-17 08:57:49

标签: c

是否可以确定字符串是否不能写在传递给char * string的一侧?

我的代码:

#include <stdio.h>

typedef enum string_type 
    { READ_ONLY, READ_WRITE }
    String_type;

String_type isvalid(char *s);

void test(char *s){
    if(isvalid(s))
        printf("OK\n");
    else
        printf("NG\n");
}

int main(void){
    char data_str[] = "data_str";

    test("data_str");// fails
    test(data_str);// works

    return 0;
}

String_type isvalid(char *s){
    //Can it be determined by this?
    //I don't think this is a portable way.
    return (void *)s > (void *)main ? READ_ONLY : READ_WRITE;
}

4 个答案:

答案 0 :(得分:8)

  

是否可以确定字符串是否为“只读”?

没有标准化的方法来做到这一点。

即使在一个平台上,使用地址也可能会失败,因为链接器可以自由地将数据放置在他们(开发人员掌握它们)所需的位置。


<强>更新

为了防止代码将文字传递给他们自己尝试修改传入的内存的函数,您可能希望针对代码运行静态源分析器

用于此目的的一个好工具是splint

答案 1 :(得分:2)

完全随意,但也许你可以在你的平台上使它稳定

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

int isliteral(char *s) {
    char *lit = "totally literal";
    char nolit[] = "some";
    return abs(nolit - s) > abs(lit - s) ;
}

int main(){
    char sa[] = "not literal";
    char *sl  = "literal";
    printf("%d\n", isliteral(sa));
    printf("%d\n", isliteral(sl));
    return 0;
}

给出:

0
1

答案 2 :(得分:0)

如果你想改变一个字符串我建议你创建一个字符串的副本,改变它,然后把它留给调用者他们想用它做什么。

char* change(char* original)
{
  int len = strlen(original);
  char* copy = new char[len + 1];
  strcpy(copy, original);
  copy[0] = 'H';
  return copy;
}

int main()
{
  char* data_str = "Bello world";

  const char* first_changed = change(data_str);
  const char* second_changed = change("Bello world");

  cout << first_changed << endl;
  cout << second_changed << endl;

  delete[] first_changed;
  delete[] second_changed;

  return 0;
}

更好:使用std::string并免除new / delete字符数组的负担。

答案 3 :(得分:0)

常量是一个编译时概念,但是有一个异常是指针,因为c-string = char *所以有可能知道char *在运行时是否是只读的:

#include <iostream>
#include <typeinfo>
int main()
{
    char * str1;
    const char *  str2 = "str2";
    std::cout<<"char * : "<<typeid(str1).name()<<"\n";
    std::cout<<"const char * : "<<typeid(str2).name()<<"\n";
    system("pause");
}

输出是:

char * : Pc
const char * : PKc
Appuyez sur une touche pour continuer... // press any key to continue