小编Ang*_*ber的帖子

如何使用char*成员为结构分配内存

我的结构看起来像这样:

struct tlv_msg
{
   uint8_t datatype;   //type of data
   /* data stored in a union */
   union{
     int32_t s32val;          /*  int */
     int64_t s64val;          /*  long long */
     uint32_t u32val;         /*  unsigned int */
     uint64_t u64val;         /*  unsigned long long */
     char* strval;            /*  string */
     unsigned char* binval;   /*  any binary data */
   };

   uint32_t bytelen;  /* no. bytes of union/data part */
};
Run Code Online (Sandbox Code Playgroud)

此结构使用联合来保存一些不同的数据类型.我有一个alloc函数,它为堆上的struct分配内存.我是否正确地认为如果我分配一个整数类型(即联合上面的前四种类型)我只需要按如下方式分配:

tlv_msg* msg = malloc(sizeof(tlv_msg));
Run Code Online (Sandbox Code Playgroud)

sizeof(tlv_msg)返回24.我假设这是足够的字节来保存union中的最大数据类型以及其他数据成员.(不知道为什么24 - 有人可以解释吗?).

但是如果要存储的数据类型是指针类型,例如char*,那么我还需要这样做:

msg->strval = (char*)malloc(sizeof(string_length+1);
Run Code Online (Sandbox Code Playgroud)

这对我来说是有意义的,这似乎有效,但只是想检查.

c memory-management

3
推荐指数
1
解决办法
1482
查看次数

如何在运行时创建C中的二维数组

我无法从2个变量创建2D数组(例如,int arr[i][j]不允许),那么我将如何创建动态大小的2D数组?

数组的维度仅在我的程序中在运行时已知.该数组用于表示网格.我将如何在C中编码?

c multidimensional-array

3
推荐指数
2
解决办法
1万
查看次数

为什么没有用于签名长的套接字ntol?

如果我想在网络上传输带符号的长整数(32位整数),我该怎么办?如果我作为签名长发送,那么在另一端我不会(可能)知道远程机器如何代表签名号码?那我该怎么办?

c sockets

3
推荐指数
1
解决办法
2198
查看次数

为什么AND数字在签名和未签名的演示文稿之间转换?

下面的代码显示一个以十六进制格式存储为Java字节值的数字,以及有符号和无符号表示形式.这可能不是正确的措辞.我的意思是,这些数字可以是C风格的1字节无符号字符值.如果我正在解释这些值(这里恰好是Java,但可能使用任何语言中的任何有符号类型),那么如果'number'溢出使用符号位,则数字将显示为负数.但是我可以通过ANDFF和0xFF在无符号解释中打印.

我理解AND是如何工作的,但我无法理解ANDing如何呈现为无符号.有人可以解释一下吗?

public class understand_casting {
    public static String printbinary(byte val) {
      int displayMask = 1 << 7;
          String str = new String();
          for(int bit = 1; bit <= 8; ++bit) {
              str += (val & displayMask) == 0 ? '0' : '1';
              val <<= 1; //shift one to left
          }
          return str;
    }

  public static void main(String[] args) {   
     System.out.printf("0x50=%s, as int=%d, as unsigned int=%d\n", printbinary((byte)0x50), (byte)0x50, ((byte)0x50 & 0xFF));
     System.out.printf("0x88=%s, as int=%d, as unsigned int=%d\n", printbinary((byte)0x88),(byte)0x88, ((byte)0x88 & …
Run Code Online (Sandbox Code Playgroud)

java unsigned signed

3
推荐指数
1
解决办法
1500
查看次数

Haskell类型定义,=>等

我正在使用Learn You a Haskell学习Haskell.在页面54是像这样的实现:

take' :: (Num i, Ord i) => i -> [a] -> [a]
take' n _
    | n <= 0 = []
take' _ []   = []
take' n (x:xs) = x : take' (n-1) xs
Run Code Online (Sandbox Code Playgroud)

我理解除第一行之外的所有代码.

我理解为::这是一个类型定义吗?

(Num i,Ord i)是一个元组.元组的第一个元素必须是数字的,足够公平.必须能够订购第二个参数.参数是相同的 - 都是我.这意味着类型必须相同?

为什么不呢(Num i,Ord j)?不是第二个元组元素引用列表吗?哪个可以是任何类型?

什么=>表示?

i - > [a] - > [a]表示第一个参数是数字?第二个参数是任何类型列表,第三个参数是任何类型列表.所以这就是说第一个param数字,第二个参数是任何类型的列表,它返回任何类型的列表.嗯,这是可以理解的,我想.

haskell

3
推荐指数
1
解决办法
274
查看次数

如何声明模板化函数,以便可以在类构造函数/函数中传递

我想将用户定义的函数传递给需要用户定义的匹配函数的类.在CI期间,CI会使用带有void*参数的函数指针.但必须有更好的方法......

这大致是我想要做的事情.我的一个限制是我所在的平台没有标准库.但是可以使用基本的核心语言C++ 11.

我需要做什么:

#include <iostream>

using namespace std;

// TODO - replace this C construct with C++ equivalent
//typedef bool(*match_key)(const void* key1, const void* key2);

// somehow declare this as a typedef?  need a way to declare a signature in C++
typedef template<class T>
bool (*match_key)(const T& key1, const T& key2);


// *** User defined matching function
bool mymatcher(const int i, const int j) {
    return i == j;
}

template<class K>
class hashmap {
public:
    hashmap<K>(const K& key, …
Run Code Online (Sandbox Code Playgroud)

c++ function-pointers function-prototypes

3
推荐指数
1
解决办法
61
查看次数

可以在数组开始之前向后迭代到一个

例如,我有一个字符串的ptr并将ptr移动到字符串中的最后一个字符并使用*p--向后迭代到字符串的开头,并且我在数组开始之前迭代到位置1这样可以吗?或者我会获得访问冲突?我只是移动指针 - 不访问.它似乎在我的代码中工作,所以想知道它是不是很糟糕的做法?

这是一个带有*next-- = rem +'A'的样本行; 是一个我在质疑如果好吗???

#include <stdio.h>     /* printf */
#include <string.h>    /* strlen, strcpy */
#include <stdlib.h>    /* malloc/free */
#include <math.h>      /* pow */

/* AAAAA (or whatever length) = 0, to ZZZZZ.  base 26 numbering system */
static void getNextString(const char* prev, char* next) {
   int count = 0;
   char tmpch = 0;

   int length = strlen(prev);
   int i = 0;
   while((tmpch = *prev++) != 0) {
      count += (tmpch - 'A') * (int)pow(26.0, …
Run Code Online (Sandbox Code Playgroud)

c arrays pointers

2
推荐指数
1
解决办法
168
查看次数

C方式表示功能失效

我有一系列C函数:

const char* find_string(uint8_t id);
int32_t find_int32(uint8_t id);
uint32_t find_uint32(uint8_t id);
uint64_t find_uint64(uint8_t id);
Run Code Online (Sandbox Code Playgroud)

返回找到的项目(在链表中).对于字符串,我可以返回一个空字符串.但是对于整数值,我想指出是否找到了积分值.C语言的用法是什么?

像这样: ?

uint32_t find_uint32(uint8_t id, int* success);
Run Code Online (Sandbox Code Playgroud)

c

2
推荐指数
1
解决办法
178
查看次数

字符串指针行为我试图理解

我编写了一个replacechar函数,用替换char替换源char的实例.该函数的工作原理是字符串按预期更改,但是当我尝试使用函数的返回值时,put只输出一个空行.

有人可以解释一下正在发生的事情以及我需要在replacechar中修改的内容.

#include <stdio.h>  /* puts */
#include <string.h> /* strcpy */
#include <stdlib.h> /* malloc, free */

char* replacechar(char* s, char ch1, char ch2) {
   while (*s) {
      if (*s == ch1)
         *s = ch2;

      *s++;
   }

   return s;
}

int main()
{
   char* s = malloc(8);

   strcpy(s, "aarvark");

   puts(replacechar(s, 'a', 'z')); /* prints blank line */

   puts(s);  /* prints zzrvzrk as expected */

   free(s);

   return 0;
}
Run Code Online (Sandbox Code Playgroud)

感谢所有的回复.

我已经改为这个(现在工作正常).

char* replacechar(char* s, char ch1, char ch2) {
   char* …
Run Code Online (Sandbox Code Playgroud)

c pointers

2
推荐指数
1
解决办法
97
查看次数

如何在 std::unordered_map 中插入一个键但没有值

我有一个

std::unordered_map< std::string, std::unordered_map<std::string, std::string> > 
Run Code Online (Sandbox Code Playgroud)

我只想插入键并稍后填写值。

例如像这样:

#include <string>
#include <unordered_map>

int main() {
    std::unordered_map< std::string, std::unordered_map<std::string, std::string> > mymap;
    mymap.insert("TestKey");
}
Run Code Online (Sandbox Code Playgroud)

这给出了错误:

source.cpp(6): error C2664: 'void std::_Hash<std::_Umap_traits<_Kty,_Ty,std::_Uhash_compare<_Kty,_Hasher,_Keyeq>,_Alloc,false>>::insert(std::initializer_list<std::pair<const _Kty,_Ty>>)' : cannot convert argument 1 from 'const char [8]' to 'std::pair<const _Kty,_Ty> &&'
1>          with
1>          [
1>              _Kty=std::string
1>  ,            _Ty=std::unordered_map<std::string,std::string,std::hash<std::string>,std::equal_to<std::string>,std::allocator<std::pair<const std::string,std::string>>>
1>  ,            _Hasher=std::hash<std::string>
1>  ,            _Keyeq=std::equal_to<std::string>
1>  ,            _Alloc=std::allocator<std::pair<const std::string,std::unordered_map<std::string,std::string,std::hash<std::string>,std::equal_to<std::string>,std::allocator<std::pair<const std::string,std::string>>>>>
1>          ]
1>          and
1>          [
1>              _Kty=std::string
1>  ,            _Ty=std::unordered_map<std::string,std::string,std::hash<std::string>,std::equal_to<std::string>,std::allocator<std::pair<const std::string,std::string>>>
1>          ]
1>          Reason: …
Run Code Online (Sandbox Code Playgroud)

c++ unordered-map hashtable

2
推荐指数
1
解决办法
2785
查看次数