c - 如何在编译时常量中使用函数
问题描述
我试图将一个随机字符串声明为一个变量,该变量会更改所有东西都可以访问的每次运行,但是我对 C 的了解非常有限。
我尝试研究多个网站并使用教程,但似乎无法正确解释。
// Declare example
#define DEST_SIZE 40
char *randstring(int length) {
char *string = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789,.-#'?!";
size_t stringLen = 26*2+10+7;
char *randomString;
randomString = malloc(sizeof(char) * (length +1));
if (!randomString) {
return (char*)0;
}
unsigned int key = 0;
for (int n = 0;n < length;n++) {
key = rand() % stringLen;
randomString[n] = string[key];
}
randomString[length] = '\0';
return randomString;
}
// char *randomHome = randstring(10);
// char * payloadPath = "~/Desktop/resign_temp_app/";
char dest[DEST_SIZE] = "~/Desktop/AppSign/";
char *randomHome = randstring(10);
char* plx = strcat(dest, randomHome);
char* plx2 = strcat(dest, "/");
const char * payloadPath = dest;
// Function Example
int rmTempAppPath(){
char dest2[DEST_SIZE] = "rm -rf ";
char *command = strcat(dest2, dest);
int status = system(command);
if (status != 0)
{
return -1;
}
return 0;
}
我希望它可以正常工作,但是我收到以下错误和警告消息
resignCore.c:39:20: error: initializer element is not a compile-time constant
char *randomHome = randstring(10);
^~~~~~~~~~~~~~
resignCore.c:41:13: error: initializer element is not a compile-time constant
char* plx = strcat(dest, randomHome);
^~~~~~~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/usr/include/secure/_string.h:131:3: note:
expanded from macro 'strcat'
__builtin___strcat_chk (dest, __VA_ARGS__, __darwin_obsz (dest))
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
resignCore.c:42:14: error: initializer element is not a compile-time constant
char* plx2 = strcat(dest, "/");
^~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/usr/include/secure/_string.h:131:3: note:
expanded from macro 'strcat'
__builtin___strcat_chk (dest, __VA_ARGS__, __darwin_obsz (dest))
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
3 errors generated.
我很抱歉提供了相当多的代码和错误,但我不太擅长解释。
解决方案
这是您的代码的修改版本,可作为一个简单示例。只是为了将来,你的代码是否很大并不重要。缩小问题的范围。我不需要您的整个项目源代码,只需给我们一个尽可能隔离问题的简单片段即可。
现在的问题是您尝试使用非编译时常量定义全局变量。所以你用编译时常量初始化它们,NULL
然后在你调用其他函数之前在你的主函数中定义它们。
strcat(dest, src)
附加src
到dest
并且返回值dest
也是。char *val = strcat(dest, src)
是多余的并且容易出错。所以只需使用strcat(dest,src)
.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define DEST_SIZE 40
// Globals
char dest[DEST_SIZE] = "~/Desktop/AppSign/";
char *randomHome = NULL;
char *randstring(int length) {
const char * string = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789,.-#'?!";
size_t stringLen = sizeof(string)/sizeof(char);
char *randomString = NULL;
randomString = malloc(sizeof(char) * (length +1));
if (!randomString) {
return NULL;
}
for (int n = 0;n < length;n++) {
unsigned int key = rand() % stringLen;
randomString[n] = string[key];
}
randomString[length] = '\0';
return randomString;
}
void printGlobal()
{
printf("%s",dest);
}
int main()
{
randomHome = randstring(10);
strcat(dest, randomHome);
printGlobal();
strcat(dest, "/");
printGlobal(); // print updated dest value
}
免责声明,如果您不delete
使用后生成的 randomString,则会出现内存泄漏。
我有时喜欢做的事情,尤其是当我测试新代码或库时,它会创建一个迷你项目,例如单个文件项目。然后尝试创建一个最小的工作示例。如您所见,我不需要其他 2 个文件来尝试调试此问题。
推荐阅读
- trino - 坚持`SELECT * FROM system.runtime.queries`到trino中的表?
- angular - 无法安装 ngx-slick-carousel
- c++ - 取消引用函数指针的值是什么意思
- flutter - 在 Flutter 中播放在后台播放的音频和鸭子音乐
- javascript - Shoptagr 的可能解决方案
- c++ - 在 vscode 中如何检查 C++ 方法在编辑器中是私有的还是公共的?
- php - 从 laravel 中的 stdClass 对象获取数据
- ionic-framework - 离子路由器动画类型“字符串”不可分配给类型“布尔”
- amazon-web-services - Amazon 无法访问 AWS RDS 中数据加密中 KMS 中使用的密钥吗?
- assembly - 如何在视频模式下打印居中(垂直和水平)的字符串?