【问题标题】:C segmentation fault-char pointersC 分段错误字符指针
【发布时间】:2012-03-11 19:38:32
【问题描述】:

我需要帮助找出为什么我在这里遇到分段错误。我已经检查过了,我认为我的指针做错了,但我可以弄清楚是什么。

我的程序:

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

void encrypt(char* c);

//characters are shifted by 175

int main(){

char* a;
*a = 'a';
/*SEGMENTATION FAULT HERE!*/

encrypt(a);
printf("test:%c/n",*a);

return 0;

};
void encrypt(char* c){
    char* result;
    int i=(int)(*c);
    i+=175;
    if(i>255)
    {
            i-=256;
    }
    *c=(char)i;

};

【问题讨论】:

    标签: c encryption segmentation-fault


    【解决方案1】:

    问题出在这里:

    char *a;
    *a = 'a'
    

    由于变量“a”未初始化,*a = 'a' 分配给随机内存位置。

    你可以这样做:

    char a[1];
    a[0] = 'a';
    encrypt(&a[0]);
    

    或者在你的情况下甚至只使用一个字符:

    int main(){
      char a = 'a';
    
      encrypt(&a);
      printf("test:%c/n",a);
    
      return 0;
    };
    

    【讨论】:

      【解决方案2】:
      char* a;
      *a = 'a';
      /*SEGMENTATION FAULT HERE!*/
      

      那里没有任何“那里”。您已声明 a 并使其未初始化。然后您尝试将其用作地址。你需要让a 指向某个东西。

      一个例子:

      char buffer[512];
      char *a = buffer;
      

      (注意buffer 有一个最大大小,当它超出范围时,您不能引用任何指向它的指针。)

      或动态内存:

      char *a = malloc(/* Some size... */);
      
      if (!a) { /* TODO: handle memory allocation failure */ }
      
      // todo - do something with a.
      
      free(a);
      

      【讨论】:

        【解决方案3】:

        那个指针a 没有得到存储数据的实际空间。你只是声明了指针,但是指向哪里呢?你可以这样分配内存:

        char *a = malloc(1);
        

        那么它就不会出现段错误。之后你必须释放变量:

        free(a);
        

        但在这种情况下,更好,

        char a = 'a';
        encript(&a);
        

        【讨论】:

        • malloc(1) 似乎是处理这个特定示例的重量级方法。
        • 是的,你说得对。只是想展示一些分配动态内存的模式。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-07-23
        • 2013-09-18
        • 2016-02-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-10
        相关资源
        最近更新 更多