首页 > 解决方案 > 如何在编译时常量中使用函数

问题描述

我试图将一个随机字符串声明为一个变量,该变量会更改所有东西都可以访问的每次运行,但是我对 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.

我很抱歉提供了相当多的代码和错误,但我不太擅长解释。

标签: cstring

解决方案


这是您的代码的修改版本,可作为一个简单示例。只是为了将来,你的代码是否很大并不重要。缩小问题的范围。我不需要您的整个项目源代码,只需给我们一个尽可能隔离问题的简单片段即可。

现在的问题是您尝试使用非编译时常量定义全局变量。所以你用编译时常量初始化它们,NULL然后在你调用其他函数之前在你的主函数中定义它们。

strcat(dest, src)附加srcdest并且返回值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 个文件来尝试调试此问题。


推荐阅读