【问题标题】:assignment discards 'const' qualifier from pointer target type [-Wdiscarded-qualifiers]赋值从指针目标类型中丢弃“const”限定符 [-Wdiscarded-qualifiers]
【发布时间】:2021-11-24 20:26:48
【问题描述】:
char *inputtxt;
void encrypt()
{

    inputtxt = gtk_entry_get_text (GTK_ENTRY (input_));
    unsigned char key[AES_SIZE+1] = { "YELLOW SUBMARINE" };
    memcpy(inputtxt,"gg",32);
    memcpy(key, "HERE IS MY KEY!!", 16);
    unsigned char iv[AES_SIZE+1] = { "HERE IS MY IV!!!" };
    aes_cbc_encrypt(inputtxt, key, 32, iv);
    gtk_label_set_text(GTK_LABEL(outputk_), inputtxt);

我似乎根本无法让它工作,我在“inputtxt = gtk_entry_get_text (GTK_ENTRY (input_));

【问题讨论】:

  • 建议阅读gtk_entry_get_text manual"返回: const gchar * 一个指向widget内容的字符串指针。这个字符串指向widget内部分配的存储空间,不能是释放、修改或存储。”。也就是说,真正的问题是您试图修改inputtxt,这是明确不允许的。
  • 永远不要重复使用iv
  • 如果我不能修改 inputtxt 我将如何进一步处理我的代码

标签: c gtk3 glade


【解决方案1】:

gtk_entry_get_text的签名是

const gchar* gtk_entry_get_text(GtkEntry *entry);

结果

char *inputtxt;

应该是

const char *inputtxt;

你不能使用memcpy

不管怎样,你想达到什么目的

memcpy(inputtxt,"gg",32);

??

第三个参数是要复制的字节数。你不能从文字“gg”复制32个字节。

【讨论】:

  • 如何定义字节数?
  • memcpy(key, "HERE IS MY KEY!!", 16); 很好,因为字面量长度为 17,因此您要复制除尾随 NUL 之外的整个字符串,但对于“gg”,您不能复制超过 2 或 3 个字节(如果您对 NUL 感兴趣)并使用 32 个字节,您正在访问文字边界之外的内容。正如我在答案中所说,您不能将memcpy与常量一起使用,但您可以复制和修改字符串,看看g_strdup_printf
  • 我将 memcpy 更改为 g_trdup_printf 并且函数 aes_cbc_encrypt 需要 unsigned char*plain_text。这给出了错误传递“aes_cbc_encrypt”的参数 1 从指针目标类型中丢弃“const”限定符 [-Wdiscarded-qualifiers]
  • @David Ranieri – 我没有回应您对上述评论的回复。 :-) 但是多亏了你,我意识到即使是评论者也没有提到AES_cbc_encrypt,而是aes_cbc_encrypt,所以我将删除上面的回复。
  • @Peter Bjørholm Hansen - aes_cbc_encrypt 在哪里以及如何定义?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-29
  • 1970-01-01
  • 1970-01-01
  • 2017-10-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多