C : Segmentation fault with typecasting

标签 c network-programming segmentation-fault packet-sniffers typecasting-operator

在我的 C 代码中,我的字符串(类型为“char”)包含捕获的数据包的有效负载。由于它的某些内容无法打印,我尝试将它们类型转换为“unsigned char”。我遇到段错误。 类型转换为“char”会产生相同的结果。

类型转换会导致段错误吗?如果是,类型转换什么时候会导致段错误?

更新

我正在尝试检查有效负载是否包含任何 URL。 每个数据包的“payload_length”各不相同,并且可能非常大。

char str[payload_length+10];
size_t size_read;
str[strlen(str)]='\0';//Adding '\0' after loading the payload contents.

if((pos=strstr((char)str,"http"))==NULL || (pos=strstr((char)str,"Host:"))==NULL || (pos=strstr((char)str,".com"))==NULL || (pos=strstr((char)str,"www."))==NULL)
printf("\nNo distinct URL is present\n ");

else
printf("\nURL is at %p ",pos);

最佳答案

问题1: (char)str。您将数组转换为单个 char。这是无稽之谈,你应该知道为什么。另外,如果没有编译器消息,这应该不能干净地编译,否则你的编译器就是垃圾。

问题2:每次更新pos,并且||从左到右强制求值。如果 ".com" 后面有 "www",这将是一个非常奇怪的 URL。因此,在 pos=strstr((char)str,".com" 后,您指向字符串的末尾,并且在任何地方都找不到 "www"

编写这种晦涩的一行代码的替代方法可能是这样的:

bool validate_url (const char* str)
{
  const char* MUST_CONTAIN[] =
  {
    "http",
    "Host:",
    ".com",
    "www"
  };

  for(size_t i=0; i<sizeof(MUST_CONTAIN)/sizeof(*MUST_CONTAIN); i++)
  {
    if(strstr(str, MUST_CONTAIN[i] == NULL)
    {
      return false;
    }
  }

  return true;
}

如果您可以假设字符串以特定顺序出现(您应该能够这样做),则可以进行优化。

问题 3:strlen 假定字符串已经以 null 结尾,因此您不能编写类似 str[strlen(str)]='\0'; 的代码。

关于C : Segmentation fault with typecasting,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47812683/

相关文章:

c++ - 增加 C/C++ 程序使用的(非堆栈)内存

network-programming - 在网络套接字上的 recv 系统调用上收到 ENOENT

c++ - 访问 std::string 字符的段错误

java - validator getPasswordAuthentication 未调用

c - 插入操作中段错误错误

c - 将指针分配给结构 C 时出现段错误

objective-c - OBJ-C : NSStrings - stringByAppendingString method

c - 求和,数组构造和寻址的简洁二叉树

c - 用C中的单个空格替换多个空格

c - 通过 UDP 套接字发送缓冲区时,延迟有时会增加